从字节到大的无符号整数和字符串的转换

时间:2013-11-09 09:40:35

标签: java android

我有一个20字节的字节[] 我需要读取前4个字节并将它们转换为单个无符号整数,然后转换为字符串 字节生成一个大整数,所以当我转换为一个整数然后在一个字符串中,我有一个负数 示例:0x53,0x2D,0x78,0xAA。 我将它们转换为:

        hash = bHash[0]|bHash[1]<<8|bHash[2]<<16|bHash[3]<<24;
        keyid = String.valueOf(hash);
        keyid = Integer.toString(hash);

我在两种情况下都有:“ - 1434964653”但我需要生成“2860002643”。

2 个答案:

答案 0 :(得分:1)

由于Java中没有unsigned int,因此请使用long类型:

 long hash = (bHash[0]|bHash[1]<<8|bHash[2]<<16|bHash[3]<<24)&0xFFFFFFFFl;
 String keyid = String.valueOf(hash);
 keyid = Long.toString(hash);

答案 1 :(得分:0)

我写了一个小例子。

这是我用来操作字节的库。

@Test
public void readUnsignedInt () {
    //0x53, 0x2D, 0x78, 0xAA.
    //http://stackoverflow.com/questions/19874527/conversion-from-bytes-to-large-unsigned-integer-and-string
    ByteBuf buf = ByteBuf.create ( 20 );
    buf.addByte ( 0xAA );
    buf.addByte ( 0x78 );
    buf.addByte ( 0x2D );
    buf.addByte ( 0x53 );

    byte[] bytes = buf.readForRecycle ();

ByteBuf是一个轻量级的可重用缓冲区。 Boon是一个用于在Java和其他实用程序中实现切片表示法的库。

您可以使用idxUnsignedInt读取无符号字节,第二个arg是偏移量。

    long val = idxUnsignedInt ( bytes, 0 );

    boolean ok = true;

BTW die抛出一个运行时异常并返回一个布尔值,这样你就可以将它短路或者表达式来创建一种无法被编译器关闭的断言。 :)

    ok |= val ==  2860002643L || die(); //die if not equal to 2860002643L

你也可以阅读多头(你没有问,但我还是想告诉你)。

    buf.add ( 2860002643L );

    bytes = buf.readForRecycle ();

    val = idxLong ( bytes, 0 );

    ok |= val ==  2860002643L || die();

您还可以将无符号整数添加到字节数组缓冲区。适合测试。

    //add unsigned int to the byte buffer.
    buf.addUnsignedInt ( 2860002643L );

    //read the byte array of the buffer
    bytes = buf.readForRecycle ();

    //Read the unsigned int from the array, 2nd arg is offset
    val = idxUnsignedInt ( bytes, 0 );

    //Convert it to string and print it to console
    puts("" + val);

    ok |= val ==  2860002643L || die();

以上内容涵盖了您问题的所有部分。它读取它并将其转换为字符串。

这里再次转换为字符串。

    ok |= ("" + val).equals("2860002643") || die();

现在只提供几种组合。

    //Read the unsigned int from the array, 2nd arg is offset
    byte [] bytes2 = new byte[] {
            (byte)0xAA, 0x78, 0x2D, 0x53,   0,
                  0,       0,    0,    0,   0,
                  0,       0,    0,    0,   0,
                  0 ,      0,    0,    0,   0 };


    val = idxUnsignedInt ( bytes2, 0 );

    ok |= val ==  2860002643L || die();


    //Deal direct with bytes
    byte [] bytes3 = new byte[20];


    unsignedIntTo ( bytes3, 0,  2860002643L);

    val = idxUnsignedInt ( bytes2, 0 );

    ok |= val ==  2860002643L || die();

}

我永远无法记住如何做到这一点,我厌倦了查找它,所以我写了这些东西。

您可以在此处详细了解ByteBuf。 :)

https://github.com/RichardHightower/boon/wiki/Auto-Growable-Byte-Buffer-like-a-ByteBuilder