来自UInt8List的Int16无法读取,转换为asByteArray时数据错误

时间:2018-12-22 16:46:15

标签: dart flutter

我试图从数据中获取整数,数据从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 ) 

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
}