如何通过Dart TCP套接字发送原始字节

时间:2018-10-18 07:08:44

标签: sockets encoding dart flutter byte

我陷入了我能想到的最愚蠢的障碍。我正在开发一个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开发的,但对我来说似乎很荒谬。

1 个答案:

答案 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)