2013-08-16 38 views
3

如何轉換java中保留相同值的十六進制字符串。Java將十六進制字符串轉換爲java:char [](C)to byte [](JAVA)

在C我有:

char tab[24] = { 0x02, 0x04, 0xF3, 0xFC, 0xFF, 0x06, 0x00, 0xF7, 0x00, 0x00, 0x09, 0xFD, 0xFD, 0x00, 0x03, 0x0A, 0xFD, 0x02, 0xFD, 0x08, 0x08, 0x00, 0x01, 0xFD }; 

而且我複製到Java像串;

String hexString = "0x02, 0x04, 0xF3, 0xFC, 0xFF, 0x06, 0x00, 0xF7, 0x00, 0x00, 0x09, 0xFD, 0xFD, 0x00, 0x03, 0x0A, 0xFD, 0x02, 0xFD, 0x08, 0x08, 0x00, 0x01, 0xFD"; 

現在我想在字節[]轉換,我想辦法如何做到這一點,但它看起來像我不正確的格式轉換。

解決

String[] split = hexString.split(", ");  
byte[] arr = new byte[split.length]; 
for (int i = 0; i < split.length; i++) 
{ 
    arr[i] = (byte)(short)Short.decode(split[i]); 
} 

回答

3

如果你真的想給定的字符串轉換爲byte[](儘管這似乎是一個奇怪的要求)...

String hexString = "0x02, 0x04, 0xF3, 0xFC, 0xFF, 0x06, 0x00, 0xF7, 0x00, 0x00, 0x09, 0xFD, 0xFD, 0x00, 0x03, 0x0A, 0xFD, 0x02, 0xFD, 0x08, 0x08, 0x00, 0x01, 0xFD"; 
String[] split = hexString.split(", "); 
byte[] arr = new byte[split.length]; 
for (int i = 0; i < split.length; i++) 
{ 
    arr[i] = (byte)Short.parseShort(split[i].substring(2), 16); 
} 
System.out.println(Arrays.toString(arr)); 

我們需要使用parseShort而不是parseByte因爲試圖解析類似0xF3parseByte導致NumberFormatException: Value out of range

打印:

[2, 4, -13, -4, -1, 6, 0, -9, 0, 0, 9, -3, -3, 0, 3, 10, -3, 2, -3, 8, 8, 0, 1, -3] 
+0

現在我有類似的東西。缺少整數。那麼哪一個更好? – rikkima

+0

而不是使用'parseShort',你也可以說'arr [i] =(byte)(short)Short.decode(split [i]);'它會自動識別字符串前面的「0x」if在那。需要額外的演員來解除短路。 – ajb

2

你在C什麼是此在的Java:

byte[] tab = { 0x02, 0x04, (byte) 0xF3, (byte) 0xFC, (byte) 0xFF, 0x06, 
       0x00, (byte) 0xF7, 0x00, 0x00, 0x09, (byte) 0xFD, (byte) 0xFD, 
       0x00, 0x03, 0x0A, (byte) 0xFD, 0x02, (byte) 0xFD, 0x08, 
       0x08, 0x00, 0x01, (byte) 0xFD }; 

注意,代替char您使用byte,那是允許的以外的值範圍爲byte,如0xFD需要顯式強制轉換。並且您不在聲明中包含數組長度。


更新:不添加石膏手動可以聲明更寬類型(如int或短)的數據,然後遍歷它:

int[] temp = { ... }; 
byte[] tab = new byte[temp.length]; 
for (int i = 0; i<temp.length; i++) tab[i]=(byte)temp[i]; 

更好的解決方案將是裝載來自外部文件的數據。大數組文字不會像C編譯器對大數組文字進行編碼那樣以緊湊的方式編碼到類文件中。

+0

我已經看到了這種方式,但在實際中我有char數組10504長,所以我不想寫投票表示法。無論如何謝謝 – rikkima

+0

@rikkima你可以使用上面的代碼,而不是'short []'(因此不需要轉換),並且有一個簡單的for循環運行,並將每個轉換爲'byte'並將其放入byte []中',即'for(int i = 0; i Dukeling

+0

查看更新,然後.. – Joni

0

@Joni有正確的答案。但是如果你想在運行時執行此操作,你可以這樣做:

String hex = "0xFFFFFFFF"; 
    long longRep = Long.decode(hex); 
    byte[] byteRep = String.valueOf(intrRep).getBytes("UTF-8"); 

    //to verify 
    System.out.println(Long.toHexString(Long.valueOf(new String(byteRep,"UTF-8")))); 
相關問題