gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:38:25 26 4
gpt4 key购买 nike

我遇到了我能想到的最愚蠢的障碍。我正在开发一个 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 命令检查)。

我在 google 上搜索了一段时间,寻找一种发送原始字节而不将它们编码为字符串的方法,但找不到任何东西。难道根本就没有考虑过吗?我意识到 Flutter 和 Dart 是为高级 Web 开发而设计的,但这对我来说似乎很荒谬。

最佳答案

显然可以不关心编码而写字节;然而,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)

关于sockets - 如何通过 Dart TCP 套接字发送原始字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com