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

现在我想转换为字节 [],我找到了一些方法来做到这一点,但看起来我没有以正确的格式转换。

解决了

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]);
}
4

3 回答 3

4

如果您真的想将给定的字符串转换为 a 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因为试图解析类似0xF3with Causes 的东西。parseByteNumberFormatException: 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]
于 2013-08-16T16:20:45.547 回答
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 编译器编码大数组文字那样以紧凑的方式编码到类文件中。

于 2013-08-16T16:09:56.990 回答
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")))); 
于 2013-08-16T16:23:32.937 回答