我陷入了我能想到的最愚蠢的障碍。我正在开发一个Flutter应用,该应用应通过TCP套接字(在本地wifi网络上)发送字节数组。
所述字节是原始字节,不代表任何编码中的有意义字符(我具有0xFF之类的值,依此类推)。我的代码通过使用套接字write
方法成功连接并发送了数据。不幸的是,该方法仅将经过编码的String
作为参数,然后通过字符代码创建一个使我的信息无效。
这是我的代码:
var message = Uint8List(4);
var bytedata = ByteData.view(message.buffer);
bytedata.setUint8(0, 0x01);
bytedata.setUint8(1, 0x07);
bytedata.setUint8(2, 0xFF);
bytedata.setUint8(3, 0x88);
socket.write(String.fromCharCodes(message))
正确接收到0x01和0x07时,0xFF和0x88被转换为其他两个字节,即0xC3BF和0xC287(已通过netcat -l 8080 | hexdump
命令检查)。
我已经搜索了一段时间了,可以发送原始字节而不将它们编码为字符串,但是找不到任何东西。难道根本就没有想到吗?我意识到Flutter和Dart是用于高级Web开发的,但对我来说似乎很荒谬。
答案 0 :(得分:3)
很显然,无需关心编码就可以写字节;但是,Google搜索不会立即给出答案,可能是因为没有人提出这个问题,并且该函数本身没有明显的名称或描述。
Dart中的Socket
类继承自IOSink
类,该类具有add()
方法,可以完全满足我的需要。
从文档中:
void add (List<int> data)
Adds byte data to the target consumer, ignoring encoding.
The encoding does not apply to this method, and the data list is passed directly to the target consumer as a stream event.
This function must not be called when a stream is currently being added using addStream.
This operation is non-blocking. See flush or done for how to get any errors generated by this call.
The data list should not be modified after it has been passed to add.
https://api.dartlang.org/stable/2.0.0/dart-io/Socket-class.html
正确的代码就是
var message = Uint8List(4);
var bytedata = ByteData.view(message.buffer);
bytedata.setUint8(0, 0x01);
bytedata.setUint8(1, 0x07);
bytedata.setUint8(2, 0xFF);
bytedata.setUint8(3, 0x88);
socket.add(message)