我试图从数据中获取整数,数据从websocket中获取,但是有些事情是错误的,当我从UInt8List->字节数据-> UInt8List进行转换时,它在我的数组中添加了2个新的uint8。任何人都建议我如何从字节数组获取int的正确方法。 (这是很大的Endian,我在Swift中的代码和在Dart中的基本写入数据仍然正确)。谢谢任何人阅读。
我正在使用'dart:typed_data';并从WebSocket(dart:io)获取数据
print(responseData); // UInt8List: [0, 1, 0, 1, 0, 1, 49]
var byteData = responseData.buffer.asByteData();
var array = byteData.buffer.asUint8List();
print(array); // UInt8List: [130, 7, 0, 1, 0, 1, 0, 1, 49]
var shortValue = responseData.buffer.asByteData().getInt16(0);
print(shortValue); // -32249 ( 2 first byte: [0 ,1] so it must be 1 )
答案 0 :(得分:1)
还有其他事情发生,因为您的代码没有添加任何额外的字节-实际上,它不使用array
。
此代码:
import 'dart:typed_data';
void main() {
Uint8List responseData = Uint8List.fromList([0, 1, 0, 1, 0, 1, 49]);
print(responseData); // UInt8List: [0, 1, 0, 1, 0, 1, 49]
var byteData = responseData.buffer.asByteData();
//var array = byteData.buffer.asUint8List();
//print(array); // UInt8List: [130, 7, 0, 1, 0, 1, 0, 1, 49]
var shortValue = responseData.buffer.asByteData().getInt16(0);
print(shortValue); // -32249 ( 2 first byte: [0 ,1] so it must be 1 )
}
打印(按预期)
[0, 1, 0, 1, 0, 1, 49]
1
编辑-如注释中所建议,您拥有的Uint8List实际上是具有非零偏移量的ByteBuffer上的视图。因此,responseData.buffer
是该基础缓冲区,其中包含其他字节。最简单的解决方案是复制视图。
import 'dart:typed_data';
void main() {
Uint8List original = Uint8List.fromList([130, 7, 0, 1, 0, 1, 0, 1, 49]);
print(original);
Uint8List view = Uint8List.view(original.buffer, 2);
print(view);
print(view.buffer.lengthInBytes); // prints 9
print(view.buffer.asByteData().getUint16(0)); // unexpected result
Uint8List copy = Uint8List.fromList(view);
print(copy.buffer.lengthInBytes); // prints 7
print(copy.buffer.asByteData().getUint16(0)); // expected result
}