将十六进制字符串转换为Java: char[] (C) 到 byte[] (JAVA)

3

如何在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";

现在我想将其转换为byte[],我找到了一些方法来完成它,但似乎我没有以正确的格式进行转换。

已解决

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个回答

4

如果你实际上想将给定的字符串转换为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,因为尝试使用parseByte解析像0xF3这样的内容会导致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]

现在我有类似的东西。不是短整型。那么哪一个更好? - rikkima
你可以使用 Short.decode(split[i]) 来代替 parseShort,这样如果字符串前面有 "0x",它也会被自动识别。需要注意的是,为了将 Short 类型拆箱,需要进行额外的类型转换。因此,代码可以写成 arr[i] = (byte)(short)Short.decode(split[i]); - 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或short),然后循环处理它们:
int[] temp = { ... };
byte[] tab = new byte[temp.length];
for (int i = 0; i<temp.length; i++) tab[i]=(byte)temp[i];

更好的解决方案是从外部文件加载数据。大型数组文字不像C编译器编码大型数组文字那样以紧凑的方式编码到类文件中。

我已经看到这种方式了,但实际上我的字符数组长度是10504,所以我不想编写转换符号。无论如何感谢您。 - rikkima
@rikkima,你可以使用上述方法,但是使用 short[](因此不需要转换),并通过简单的 for 循环遍历每个元素并将其转换为 byte 并放入 byte[] 中,即 for (int i=0; i<shortArr.length; i++) byteArr[i] = (byte)shortArr[i]; - Bernhard Barker

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接