使用 java 将较大值的十六进制字符串转换为字节
Convert larger value hex string into bytes using java
我正在尝试将较大值的十六进制字符串转换为字节。关于转换有符号字节的信息是最大值为 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。
如果有人能帮助我,我将不胜感激。谢谢
这是正确的,因为字节是在 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
我正在尝试将较大值的十六进制字符串转换为字节。关于转换有符号字节的信息是最大值为 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。
如果有人能帮助我,我将不胜感激。谢谢
这是正确的,因为字节是在 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