6

我正在尝试在浏览器中解析二进制文件。我有 4 个字节代表一个 32 位有符号整数。
有没有一种直接的方法可以将它转换为 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;
  }
4

3 回答 3

8

您可以使用库中的ByteArraytyped_data

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);
}
于 2012-11-10T16:01:04.583 回答
3

将 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);
}

约翰

于 2012-11-10T15:54:58.430 回答
2

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

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 位无符号整数。我有一种感觉,这不是您正在寻找的东西,但它可能会对您有所帮助。

于 2012-11-10T14:53:10.877 回答