【问题标题】:Convert 4 byte into a signed integer将 4 字节转换为有符号整数
【发布时间】:2012-10-30 14:44:36
【问题描述】:

我正在尝试在浏览器中解析二进制文件。我有 4 个字节代表一个 32 位 signed 整数。
有没有一种直接的方法可以将它转换为 dart int,还是我必须手动计算二进制补码的倒数?

谢谢

编辑:使用它进行手动转换:

  int readSignedInt() {
    int value = readUnsignedInt();
    if ((value & 0x80000000) > 0) {
      // This is a negative number.  Invert the bits and add 1
      value = (~value & 0xFFFFFFFF) + 1;

      // Add a negative sign
      value = -value;
    }
    return value;
  }

【问题讨论】:

    标签: dart


    【解决方案1】:

    您可以使用来自typed_data 库的ByteArray

    import 'dart:typed_data';
    
    int fromBytesToInt32(int b3, int b2, int b1, int b0) {
      final int8List = new Int8List(4)
        ..[3] = b3
        ..[2] = b2
        ..[1] = b1
        ..[0] = b0;
      return int8List.asByteArray().getInt32(0);
    }
    
    void main() {
      assert(fromBytesToInt32(0x00, 0x00, 0x00, 0x00) == 0);
      assert(fromBytesToInt32(0x00, 0x00, 0x00, 0x01) == 1);
      assert(fromBytesToInt32(0xF0, 0x00, 0x00, 0x00) == -268435456);
    }
    

    【讨论】:

    • 已更改为dart:typed_array。继承人ByteData,大致相当于之前的ByteArray
    【解决方案2】:

    将 4 个字节放入 ByteArray 并像这样提取 Int32:

    import 'dart:scalarlist';
    
    void main() {
      Int8List list = new Int8List(4);
      list[0] = b0;
      list[1] = b1;
      list[2] = b2;
      list[3] = b3;
      int number = list.asByteArray().getInt32(0);
    }
    

    约翰

    【讨论】:

    • 有趣的是,我同时做了完全相同的答案:)
    【解决方案3】:

    我不确定你想要什么,但也许这个代码示例可能会让你有想法:

    int bytesToInteger(List<int> bytes) {
      var value = 0;
    
      for (var i = 0, length = bytes.length; i < length; i++) {
        value += bytes[i] * pow(256, i);
      }
    
      return value;
    }
    

    假设我们有[50, 100, 150, 250] 作为我们的“4 个字节”,最终结果是一个 32 位无符号整数。我感觉这不是您正在寻找的东西,但它可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2023-01-29
      • 2013-06-18
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多