我正在尝试将更大的十六进制字符串值转换为字节。有关转换有符号字节的信息是最大值0x7F仅等于127。但是现在我想将六进制值C6转换为我应该收到的字节数198.有没有办法做到这一点?
目前我已使用此方法测试了我的代码:
static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)(Integer.parseInt("C6",16) & 0xff), 0x1B};
static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)0xC6, 0x1B};
所有这些方法都只给我相同的值-58。
如果有人可以帮助我,我感激不尽。谢谢
答案 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
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。否则你将永远得到负数。