【问题标题】:Dart TypedData and big/little endian representationDart TypedData 和大/小端表示
【发布时间】:2020-12-20 02:54:18
【问题描述】:

如果我运行以下代码:

Uint8List bytes = Uint8List.fromList([1, 0, 0, 128]);
ByteBuffer byteBuffer = bytes.buffer;
Uint16List sixteenBitList = byteBuffer.asUint16List();
print(sixteenBitList);

我得到以下结果:

[1, 32768]

因为原来的值是

00000001 00000000 00000000 10000000
1        0        0        128

我原以为它们会像这样组合:

0000000100000000 0000000010000000
256              128

相反,我得到了这个:

0000000000000001 1000000000000000
1                32768

那是小端,对吧?我在我的 Mac 上运行这段代码。我得到上述结果的原因是因为我的 Mac 使用了小端序吗?如果我在大端计算机上运行相同的代码,它会给出不同的结果吗? (我在 DartPad 上得到了相同的结果,但我不知道 DartPad 在什么机器上运行。)

【问题讨论】:

    标签: dart endianness


    【解决方案1】:

    是的,预计会给出不同的结果。您将在大端系统上获得预期的结果。您当前查看字节数据的方法使用主机系统的字节序。这包括 DartPad,因为在 DartPad 中运行的代码正在编译为 JS,而 JS 仍在同一个小端系统上运行。

    Dart 语言没有固定的字节顺序。但是,某些查看字节数据的方法确实明确设置了字节顺序,例如 ByteData 类。

    【讨论】:

      【解决方案2】:

      这是克里斯托弗·摩尔的回答的一些附加信息。

      您可以使用以下方法检查计算机的字节顺序:

      print(Endian.host == Endian.little);
      

      大多数个人计算机使用小端架构,因此通常会返回 true

      您可以使用ByteData 而不是BytesBuffer 来指定要查看数据的字节顺序:

      import 'dart:typed_data';
      
      void main() {
        Uint8List byteList = Uint8List.fromList([1, 0, 0, 128]);
        ByteData byteData = ByteData.sublistView(byteList);
      
        int value = byteData.getUint16(0, Endian.big);
        print(value.toRadixString(2).padLeft(16, '0'));
        
        value = byteData.getUint16(2, Endian.big);
        print(value.toRadixString(2).padLeft(16, '0'));
      }
      

      结果是:

      0000000100000000 0000000010000000
      

      如果您将Endian.big 更改为Endian.little,结果将是:

      0000000000000001 1000000000000000
      

      您可以在此处阅读更多信息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-07
        • 2011-12-24
        • 1970-01-01
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多