2013-08-16 36 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")))); 
相关问题