dart - UInt8List 中的 Int16 不可读,转换为字节数组时数据错误
问题描述
我试图从数据中获取 int,short,从 websocket 获取数据,但有些事情是错误的,当我从 UInt8List -> Byte Data -> UInt8List 投射时,它在我的数组中添加了 2 个新的 uint8。任何人都建议我如何从字节数组中获取 int 的正确方法。(这是大端,我在 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 )
解决方案
还有其他事情发生,因为您的代码没有添加任何额外的字节 - 实际上,它没有使用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
}
推荐阅读
- cakephp - 使用前缀时从不同的模板进行 CakePHP 烘焙
- swift - 在父窗口的中心显示工作表
- javascript - 在javascript中从protobuf解码序列化数据
- java - 使用 IntelliJ 从 PropertiesLoader 加载的 Spring Boot 模块时出现 NoClassDefFoundError
- java - 将帧(android 中的 mat 数据)从 android 传递到本机 c++ 并检测人脸
- latex - 有没有办法减少乳胶中标题和副标题之间紧凑外观的上边距?
- spring - 方法级别的弹簧注释建议顺序
- pandas - 将分类数值数据编码到不同的列
- python-3.x - 将 3d 数据输入到 lstm
- gmail - 仅为 Gmail 用户隐藏内容