Как отправить необработанные байты через сокет Dart TCP - PullRequest
0 голосов
/ 18 октября 2018

Я застрял на самом тупом из возможных препятствий, которые я только могу придумать.Я разрабатываю приложение флаттера, которое должно отправлять через сокет TCP (в локальной сети Wi-Fi) массив байтов.

Указанные байты являются необработанными и не представляют значимых символов в любой кодировке (у меня есть значения, такие как 0xFFи так далее).Мой код успешно соединяется и отправляет данные, используя метод socket 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 предназначены для высокоуровневой веб-разработки, но мне это кажется абсурдным.

1 Ответ

0 голосов
/ 18 октября 2018

Очевидно, что можно писать байты, не заботясь о кодировании;Однако поиск в Google не дает немедленного ответа, вероятно, потому что никто больше не задавал вопрос, а сама функция не имеет явного имени или описания.

Класс Socket в Dart наследуется от 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)
...