1

我有一个 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”。

4

2 回答 2

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);
于 2013-11-09T11:12:33.297 回答
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 读取无符号字节,第二个参数是偏移量。

    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

于 2013-11-10T05:42:54.247 回答