ByteBuffer 和十进制和十六进制之间的转换
Posted
技术标签:
【中文标题】ByteBuffer 和十进制和十六进制之间的转换【英文标题】:ByteBuffer and converting between decimal and hex 【发布时间】:2017-10-28 08:28:07 【问题描述】:我要做的是取一个十进制整数,将其转换为十六进制,然后将字节分开。
据我了解,ByteBuffer
是执行此操作的最佳方式。整数不会超过 65535,所以十六进制数保证为 2 个字节。例如,我有一个整数 40000(十六进制值 9C40)。
int n1 = 40000;
ByteBuffer b = ByteBuffer.allocate(2);
b.putInt(n1);
但是,我在运行程序时收到以下错误:
线程“主”java.nio.BufferOverflowException 中的异常
我做错了什么?不应该将 9C40 写入 b
(b[0]
= 9C 和 b[1]
= 40)吗?
另外,一旦我通过了这个,如果我想将存储在b[0]
(即 9C)中的值转换为十进制(即 156),我是否只使用以下代码?
int n2 = b.get(0);
【问题讨论】:
我认为文档说得很清楚 putInt 需要 4 个字节。 docs.oracle.com/javase/7/docs/api/java/nio/… 您的代码中没有十六进制转换,ByteBuffer
不是十六进制编码的解决方案。不清楚你在问什么。
【参考方案1】:
当您使用 ByteBuffer 时,它会存储 x 分配的字节数。现在您分配了 2 个字节并尝试存储大小为 4 个字节的数据类型。因此,正如消息所述,缓冲区将超出范围。如果您想将此数据存储在一个 2 字节大小的缓冲区中,您可以使用一个短的(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
【讨论】:
我有一个问题here 我正在使用字节缓冲区,我很困惑如何在发送到其他方法之前限制字节数组的大小。想看看你能不能帮忙。【参考方案2】:你用来存储数字40000
的数据类型是int
,需要4个字节的空间。是的,我知道这个数字不会超过 65535,但计算机不会。您必须将其更改为可以存储在 2 个字节中的适当数据类型。
那个数据类型,是short
。
但是如果你使用short
还有另一个问题,你不能真正将40000
存储在Java中的short
中是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 是 40,但为什么是 -100?由于字节是有符号的,所以 156 不能表示为 156。有符号字节中的 156 是 -100。
【讨论】:
我在这里有一个question,我在其中使用字节缓冲区,我对如何在发送到其他方法之前限制字节数组的大小感到困惑。想看看你能不能帮忙。【参考方案3】:我更喜欢 Integer 类而不是 ByteBuffer,它可以将整数值转换为十六进制字符串,您可以通过方法索引获取每个字节。
使用以下代码即可 整数 n = 4000; String hex = Integer.toHexString(n);
这样你就可以得到任意一个整数的十六进制值一个字节使用字符串类的indexOf()方法
您可以使用 Integer 类中的 valueOf() 方法将十六进制值作为整数返回,该方法接受两个参数,一个是字符串,另一个是基数
【讨论】:
以上是关于ByteBuffer 和十进制和十六进制之间的转换的主要内容,如果未能解决你的问题,请参考以下文章