2017-10-28 167 views
0

基本上,我想要做的是取一个十进制整数,将其转换为十六进制,然后分开字节。我的理解是ByteBuffer是最好的方法。整数不会超过65535,所以十六进制数保证是2个字节。例如,我有一个整数40000(十六进制值9C40)。所以,我有:Java - ByteBuffer和十进制和十六进制之间的转换

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)); 

谢谢!

+1

我认为文件说得非常清楚putInt需要4个字节。 https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#putInt(int) – Surely

+0

代码中没有十六进制转换,而“ByteBuffer”不是十六进制的解决方案-encoding。不清楚你在问什么。 – EJP

回答

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

+0

我有一个问题[这里](https://stackoverflow.com/questions/46997683/sending-byte-array-of-approx-fixed-size-everytime)其中我使用字节缓冲区,我很困惑如何在发送给其他方法之前,我可以限制字节数组的大小吗?想看看你能不能帮忙。 – john

1

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

该数据类型为short

但有,如果你在Java中使用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。

+0

我有一个[问题](https://stackoverflow.com/questions/46997683/sending-byte-array-of-approx-fixed-size-everytime)在这里我正在使用字节缓冲区,我很困惑如何在发送给其他方法之前,我可以限制字节数组的大小吗?想看看你能不能帮忙。 – john

0

而不是ByteBuffer我更喜欢Integer类,它可以将整数值转换为十六进制字符串&您可以通过方法的索引获取每个字节。使用以下代码 int n = 4000; 字符串十六进制= Integer.toHexString(n);

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

你可以使用的valueOf()方法Integer类返回的十六进制值作为整数需要两个参数之一是字符串,另一个是基数

相关问题