BytesBuilder工具

BytesBuilder是一款高效实用的字节操作工具,支持Hex、int、byte、byte[]等数据类型,无需依赖额外仓库,可直接在项目中使用。通过提供丰富的append方法,能够灵活地构建和操作字节数组,适用于各种数据处理场景。

一个byte数组构建工具,支持Hex,int,byte,byte[],不依赖其他仓库,拷贝到本地即可使用。
其中ByteUtil在这:处理Byte字节的工具—ByteUtil

简单使用:

BytesBuilder builder = new BytesBuilder();
builder.append(0xff, 1); //添加byte类型,占1个长度
builder.append(data.getLength(), 2);//添加int类型,添加的数据需要占2个长度
builder.append(data.getContent());//添加byte数组类型
builder0.toArray();//转成byte[]类型。

工具类:

import java.io.Serializable;
import java.util.Arrays;

public class BytesBuilder implements Serializable {
	private static final long serialVersionUID = 1298478082864104805L;

	private byte[] bytes;

	private int capacity;
	private int count;

	public BytesBuilder() {
		this(64);
	}

	public BytesBuilder(int capacity) {
		this.bytes = new byte[capacity];
		this.capacity = capacity;
		this.count = 0;
	}

	public BytesBuilder append(byte[] bs) {
		if (bs == null || bs.length == 0) return this;

		// 扩容byte数组
		int len = bs.length;
		if (count + len > bytes.length) {
			int len2 = bytes.length + capacity + len;
			byte[] bs2 = Arrays.copyOf(bytes, len2);

			this.bytes = bs2;
		}

		// 将本次数据给存放进来
		System.arraycopy(bs, 0, bytes, count, len);

		this.count += bs.length;

		return this;
	}

	public BytesBuilder appendLE(byte[] bs) {
		return append(invert(bs));
	}

	public BytesBuilder append(String hex) {
		return append(ByteUtil.toByte(hex));
	}

	public BytesBuilder appendLE(String hex) {
		return appendLE(ByteUtil.toByte(hex));
	}

	public BytesBuilder append(String hex, int bs) {
		return append(ByteUtil.toByte(hex, bs));
	}

	public BytesBuilder appendLE(String hex, int bs) {
		return appendLE(ByteUtil.toByte(hex, bs));
	}

	public BytesBuilder append(int i, int bs) {
		return append(ByteUtil.toByte(i, bs));
	}

	public BytesBuilder appendLE(int i, int bs) {
		return appendLE(ByteUtil.toByte(i, bs));
	}

	public BytesBuilder append(byte b1) {
		return append(new byte[] { b1 });
	}

	public BytesBuilder appendLE(byte b1) {
		return appendLE(new byte[] { b1 });
	}

	public BytesBuilder append(byte b1, byte b2) {
		return append(new byte[] { b1, b2 });
	}

	public BytesBuilder appendLE(byte b1, byte b2) {
		return appendLE(new byte[] { b1, b2 });
	}

	public BytesBuilder append(byte b1, byte b2, byte b3) {
		return append(new byte[] { b1, b2, b3 });
	}

	public BytesBuilder appendLE(byte b1, byte b2, byte b3) {
		return appendLE(new byte[] { b1, b2, b3 });
	}

	public BytesBuilder append(byte b1, byte b2, byte b3, byte b4) {
		return append(new byte[] { b1, b2, b3, b4 });
	}

	public BytesBuilder appendLE(byte b1, byte b2, byte b3, byte b4) {
		return appendLE(new byte[] { b1, b2, b3, b4 });
	}

	public byte[] sub(int start, int end) {
		return Arrays.copyOfRange(bytes, start, end);
	}

	public int length() {
		return count;
	}

	public byte[] toArray() {
		return Arrays.copyOfRange(bytes, 0, count);
	}

	@Override
	public String toString() {
		return ByteUtil.toHex(toArray());
	}

	private static byte[] invert(byte[] bs) {
		if (bs == null || bs.length == 0) return bs;

		int length = bs.length;
		byte[] answer = new byte[length];
		for (int i = 0; i < answer.length; i++) {
			answer[i] = bs[length - i - 1];
		}

		return answer;
	}

}

为了向别人、向世界证明自己而努力拼搏,而一旦你真的取得了成绩,才会明白:人无须向别人证明什么,只要你能超越自己。

import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:logger/logger.dart'; /// TCP 客户端状态 enum TcpConnectionState { disconnected, connecting, connected, error, } /// TCP 客户端 - 用于长连接通信 class TcpClient extends ChangeNotifier { TcpClient({required this.logger}); final Logger logger; Socket? _socket; TcpConnectionState _state = TcpConnectionState.disconnected; String? _errorMessage; // 接收到的数据流控制器 final StreamController<Uint8List> _dataController = StreamController.broadcast(); // 连接参数 String? _host; int? _port; // Getters TcpConnectionState get state => _state; String? get errorMessage => _errorMessage; Stream<Uint8List> get dataStream => _dataController.stream; bool get isConnected => _state == TcpConnectionState.connected; String? get host => _host; int? get port => _port; /// 连接到 TCP 服务器 Future<void> connect({ required String host, required int port, Duration timeout = const Duration(seconds: 10), }) async { if (_state == TcpConnectionState.connected || _state == TcpConnectionState.connecting) { logger.w('Already connected or connecting'); return; } _host = host; _port = port; _state = TcpConnectionState.connecting; _errorMessage = null; notifyListeners(); try { logger.i('Connecting to $host:$port...'); _socket = await Socket.connect( host, port, timeout: timeout, ); print('Socket connected: $_socket'); _state = TcpConnectionState.connected; _errorMessage = null; logger.i('Connected to $host:$port'); notifyListeners(); // 监听数据 _socket!.listen( (Uint8List data) { logger.d('Received ${data.length} bytes'); _dataController.add(data); }, onError: (error) { logger.e('Socket error: $error'); _handleError(_formatErrorMessage(error)); }, onDone: () { logger.i('Connection closed by server'); disconnect(); }, cancelOnError: true, ); } catch (error, stackTrace) { logger.e('Failed to connect', error: error, stackTrace: stackTrace); _handleError(_formatErrorMessage(error)); } } /// 发送数据(字符串) Future<void> sendString(String data, {bool isHex = false}) async { if (!isConnected) { throw StateError('Not connected'); } try { if (isHex) { // HEX 格式发送 final hexString = data.replaceAll(' ', '').replaceAll('\n', ''); final bytes = _hexToBytes(hexString); _socket!.add(bytes); } else { // ASCII 格式发送 _socket!.write(data); } await _socket!.flush(); logger.d('Sent: $data'); } catch (error, stackTrace) { logger.e('Failed to send data', error: error, stackTrace: stackTrace); _handleError('Send failed: $error'); } } /// 发送字节数据 Future<void> sendBytes(Uint8List data) async { if (!isConnected) { throw StateError('Not connected'); } try { _socket!.add(data); await _socket!.flush(); logger.d('Sent ${data.length} bytes'); } catch (error, stackTrace) { logger.e('Failed to send bytes', error: error, stackTrace: stackTrace); _handleError('Send failed: $error'); } } /// 断开连接 Future<void> disconnect() async { if (_socket != null) { try { await _socket!.close(); logger.i('Disconnected from $_host:$_port'); } catch (error) { logger.e('Error closing socket: $error'); } _socket = null; } _state = TcpConnectionState.disconnected; _errorMessage = null; _host = null; _port = null; notifyListeners(); } /// 处理错误 void _handleError(String message) { _state = TcpConnectionState.error; _errorMessage = message; disconnect(); } /// 格式化错误消息为用户友好的文本 String _formatErrorMessage(dynamic error) { final errorStr = error.toString(); if (errorStr.contains('Connection timed out')) { return '连接超时:无法连接到服务器 $_host:$_port\n' '请检查:\n' '1. 服务器是否正在运行\n' '2. IP地址和端口是否正确\n' '3. 网络连接是否正常'; } else if (errorStr.contains('Connection refused')) { return '连接被拒绝:服务器未运行或端口未开放\n' '请确认服务器已启动并监听端口 $_port'; } else if (errorStr.contains('No route to host')) { return '网络不可达:无法访问 $_host\n' '请检查网络连接和IP地址是否正确'; } else if (errorStr.contains('Host unreachable')) { return '主机不可达:无法连接到 $_host\n' '请检查IP地址是否正确'; } else { return '连接失败:$errorStr'; } } /// HEX 字符串转字节 Uint8List _hexToBytes(String hex) { if (hex.length % 2 != 0) { throw FormatException('Invalid hex string length'); } final bytes = <int>[]; for (int i = 0; i < hex.length; i += 2) { final hexByte = hex.substring(i, i + 2); bytes.add(int.parse(hexByte, radix: 16)); } return Uint8List.fromList(bytes); } /// 字节转 HEX 字符串 static String bytesToHex(Uint8List bytes) { return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(' ').toUpperCase(); } /// 字节转 ASCII 字符串 static String bytesToAscii(Uint8List bytes) { try { return utf8.decode(bytes, allowMalformed: true); } catch (e) { return String.fromCharCodes(bytes); } } @override void dispose() { print('Disposing TcpClient-------->'); disconnect(); _dataController.close(); super.dispose(); } } 优化一下
最新发布
10-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值