ByteBuffer 和十进制和十六进制之间的转换

ByteBuffer and converting between decimal and hex

我想做的是取一个十进制整数,把它转成十六进制,然后把字节分开。

据我了解,ByteBuffer 是执行此操作的最佳方法。整数不会超过65535,所以十六进制数保证为2字节。例如,我有一个整数 40000(十六进制值 9C40)。

int n1 = 40000;
ByteBuffer b = ByteBuffer.allocate(2);
b.putInt(n1);

但是,当我 运行 程序时出现以下错误:

Exception in thread "main" java.nio.BufferOverflowException

我做错了什么? 9C40 不应该写入 bb[0] = 9C 和 b[1] = 40)吗?

此外,一旦我解决了这个问题,如果我想将存储在 b[0] 中的值(即 9C)转换为十进制(即 156),我是否只使用以下代码?

int n2 = b.get(0);

当您使用 ByteBuffer 时,它会存储 x 个分配的字节数。现在您分配了 2 个字节,并尝试存储大小为 4 个字节的数据类型。因此缓冲区将 运行 越界,如消息所述。如果您想将此数据存储在两个字节大小的缓冲区中,您可以使用短(16 位 - 2 字节)或者为您的 ByteBuffer 分配 4 个字节。

短:

ByteBuffer bb = ByteBuffer.allocate(2);
short myShort = (short) 40000;
bb.putShort(myShort);
System.out.println(String.format("%02X, %02X", bb.get(0), bb.get(1)));

使用整数:

ByteBuffer bb = ByteBuffer.allocate(4);
int myInt = 40000;
bb.putInt(myInt);
System.out.println(String.format("%02X, %02X", bb.get(2), bb.get(3)));

输出:9C, 40

你用来存储数字40000的数据类型是int,需要space的4个字节。是的,我知道这个数字不会超过 65535,但计算机不会。您必须将其更改为可以存储在 2 个字节中的适当数据类型。

那个数据类型,是short

但是如果你使用short还有一个问题,你不能真正存储40000 in short in Java is signed,所以它的最大值是32767.

因此,要存储您的 40000,您必须将 -25536 存储在 short 中,因为溢出。

short n1 = (short)40000; // this will cause n1 to store -25536
ByteBuffer b = ByteBuffer.allocate(2);
b.putShort(n1);

现在是打印字节的时候了。 Java 中的字节也被签名。所以如果你打印这个:

System.out.println(b.get(0));
System.out.println(b.get(1));

你会得到

-100
64

64 应该是 64,因为十六进制的 64 是 40,但为什么是 -100?由于字节是有符号的,所以156不能表示为156。有符号字节中的156是-100。

我更喜欢 Integer class 而不是 ByteBuffer,它可以将整数值转换为十六进制字符串并且您可以通过方法索引获取每个字节。

使用下面的代码就可以了 整数 n = 4000; 十六进制字符串 = Integer.toHexString(n);

这样你就可以得到一个字节的任何整数的十六进制值使用字符串类的indexOf()方法

您可以使用 Integer class 中的 valueOf() 方法获取 return 十六进制值作为整数,它有两个参数,一个是字符串,另一个是基数