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

Convert larger value hex string into bytes using java

我正在尝试将较大值的十六进制字符串转换为字节。关于转换有符号字节的信息是最大值为 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};

所有这些方法只给我相同的值 -58。

如果有人能帮助我,我将不胜感激。谢谢

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

话虽这么说,您仍然可以以那种格式发送它,但是当您使用它时,您需要将它用作 int。否则你将永远得到负数。

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

更新

看到一条关于你将如何通过串行端口发送这个的评论,你的字节数组没有任何问题。接收器(如果它是另一个 Java 程序)将必须通过将它们与 0xFF 进行“与”运算来处理字节。另一个串行程序(例如在 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 

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