使用java将较大值的十六进制字符串转换为字节

时间:2015-06-23 01:42:07

标签: java hex hexdump javax.comm

我正在尝试将更大的十六进制字符串值转换为字节。有关转换有符号字节的信息是最大值0x7F仅等于127。但是现在我想将六进制值C6转换为我应该收到的字节数198.有没有办法做到这一点?

目前我已使用此方法测试了我的代码:

  1. static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)(Integer.parseInt("C6",16) & 0xff), 0x1B};
  2. static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)0xC6, 0x1B};
  3. 所有这些方法都只给我相同的值-58。

    如果有人可以帮助我,我感激不尽。谢谢

2 个答案:

答案 0 :(得分:2)

使用方法2,不要担心字节数组中的负值。字节在java中签名,因此如果要将字节处理为0到255而不是-128到127,并且每个字节都要对0xFF进行处理。这会将字节提升为整数,并且是0到255之间的值。

更新

看到关于您将如何通过串口发送此内容的评论,您的字节数组没有任何问题。接收器(如果它是另一个Java程序)将必须通过将它们与0xFF进行AND运算来处理字节。另一个串行程序(例如在C#中)将接收字节(0x00 - 0xFF)

public static void main(String[] args) throws Exception {
    byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)0xC6, 0x1B};
    for (byte b : bytearray) {
        System.out.printf("%d ", b);
    }
    System.out.println();

    for (byte b : bytearray) {
        System.out.printf("%d ", b & 0xFF);
    }
}

输出:

2 8 22 0 0 51 -58 27 
2 8 22 0 0 51 198 27 

OLD

public static void main(String[] args) throws Exception {
    System.out.println(Byte.MIN_VALUE);
    System.out.println(Byte.MAX_VALUE);

    System.out.println(Byte.MIN_VALUE & 0xFF);
    System.out.println((byte)-1 & 0xFF);
    System.out.println((byte)-10 & 0xFF);
    System.out.println((byte)-58 & 0xFF);
}

输出:

-128
127
128
255
246
198

答案 1 :(得分:0)

这是正确的,因为字节是用java签名的。如果你需要它在0-255而不是-128到127之间,你需要使用short或int(或者我认为很长。)

话虽如此,您仍然可以以该格式发送它,但是当您使用它时,您将需要将其用作int。否则你将永远得到负数。