2012-11-10 68 views
3

我试图在浏览器中解析二进制文件。我有4个字节,代表一个32位的,签名为整数。
是否有直接的方式将此转换为飞镖int,还是我必须手动计算二进制补码的倒数?将4个字节转换为有符号整数

感谢

编辑:使用该手动转换:

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

回答

6

您可以使用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); 
} 
+0

这已更改为'镖:typed_array'。 Heres [ByteData](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:typed_data.ByteData),这与之前的'ByteArray'大致相当 – tjameson

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

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

约翰

+0

好笑的是,我没有完全一样的答案在同一时间:) –

+0

感谢约翰/亚历山大 –

相关问题