2017-10-28 1064 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類返回的十六進制值作爲整數需要兩個參數之一是字符串,另一個是基數

相關問題