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

时间:2017-10-28 08:28:08

标签: java int byte bytebuffer

我想要做的是取十进制整数,将其转换为十六进制,然后分隔字节。

我的理解是ByteBuffer是最好的方法。整数不会超过65535,因此十六进制数保证为2个字节。例如,我有一个40000的整数(十六进制值9C40)。

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

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

  

线程“main”中的异常java.nio.BufferOverflowException

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

另外,一旦我越过这个,如果我想将b[0](即9C)中存储的值转换为十进制(即156),我会使用以下代码吗?

int n2 = b.get(0);

3 个答案:

答案 0 :(得分:1)

当您使用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)));

使用int:

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

答案 1 :(得分:1)

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

该数据类型为short

但如果您使用short还有另一个问题,那么您无法在40000中将short真正存储在已签名中,因此其最大值为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是40,但为什么-100?由于字节是有符号的,156不能表示为156.有符号字节中的156是-100。

答案 2 :(得分:0)

而不是ByteBuffer我更喜欢Integer类,它可以将整数值转换为十六进制字符串&你可以通过方法索引得到每个字节。

使用以下代码执行此操作 int n = 4000; String hex = Integer.toHexString(n);

通过这种方式,您可以使用string clas的indexOf()方法获取一个字节的任何整数的十六进制值

您可以使用Integer类中的valueOf()方法将十六进制值作为整数返回,该方法接受两个参数,一个是字符串,另一个是基数