我正在尝试制作一种方法来使用位移将字节转换为等效的十六进制(作为字符)。但是,我遇到了一些意想不到的结果:一些数字返回为负数。我知道 Java 没有无符号整数的等价物,我不知道如何使它工作。这是我的代码:
final static char[] hex_val = "0123456789ABCDEF".toCharArray();
public static void main(String[] args) {
byte[] bytes = {(byte) 0x58, (byte) 0x6D, (byte) 0x8F, (byte) 0xBA, (byte) 0xF5, (byte) 0x81};
for (int i = 0; i < bytes.length; i++) {
System.out.println("Run: " + i);
System.out.println("First nibble: " + hex_val[(bytes[i] >> 4)]);
System.out.println("Second nibble: " + hex_val[(bytes[i] & 0xf)]);
}
}
这是输出:
运行:0 第一个半字节:5 第二个半字节:8 运行:1 第一个半字节:6 第二个半字节:D 运行:2
其次:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:Test.main(Test.java:10)处的-8
我知道我可以使用 String.format() 来完成此操作,但我没有使用该方法,因为我需要一种在生成最少垃圾的同时快速工作的方法。我对专家的问题是......我可以改变什么来完成这项工作?
更新
我进行了 Ted Hopp 建议的更改,它在测试方法中运行良好。我将它移到我的 Android 应用程序中,该应用程序将字节转换为 MAC 地址,并将其转换为包含格式化 MAC 的 char[]。我不再得到负数,但我得到的似乎是随机错误计算。这是我正在使用的方法:
static final char[] parser_hex_arr = "01234567890ABCDEF".toCharArray();
static final char[] parser_mac = " : : : : : ".toCharArray();
void parseMac() {
hex_sb.setLength(0);
for (hex_counter = 0; hex_counter < 6; hex_counter++) {
hex_sb.append(String.format("%02X", parser_packet_bytes[parser_skip + hex_counter]));
if (!(hex_counter == 5)) {
hex_sb.append(":");
}
}
parser_mac[0] = parser_hex_arr[ (parser_packet_bytes[parser_skip] >> 4) & 0x0f ];
parser_mac[1] = parser_hex_arr[ (parser_packet_bytes[parser_skip] & 0xf) ];
parser_mac[3] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 1] >> 4) & 0x0f ];
parser_mac[4] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 1] & 0xf) ];
parser_mac[6] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 2] >> 4) & 0x0f ];
parser_mac[7] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 2] & 0xf) ];
parser_mac[9] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 3] >> 4) & 0x0f ];
parser_mac[10] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 3] & 0xf) ];
parser_mac[12] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 4] >> 4) & 0x0f ];
parser_mac[13] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 4] & 0xf) ];
parser_mac[15] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 5] >> 4) & 0x0f ];
parser_mac[16] = parser_hex_arr[ (parser_packet_bytes[parser_skip + 5] & 0xf) ];
Log.i("PARSER", "StringBuilder.getString() = " + hex_sb.toString() + " | parser_mac = " + String.valueOf(parser_mac));
formatted_mac = String.valueOf(parser_mac);
}
parser_packet_bytes 是一个数据包字节的 byte[] 数组,parser_skip 是一个包含字节所在偏移量的 int,而 hex_sb 是一个 StringBuilder。StringBuilder.toString() 的输出应该与 String.valueOf(parser_mac)... 相同,但事实并非如此。这是一个例子:
I/PARSER (10860):StringBuilder.getString() = AC:22:0B:40:70:41 | parser_mac = 0B:22:0A:40:70:41
I/解析器 (10860): StringBuilder.getString() = C8:F7:33:0E:7E:AF | parser_mac = B8:E7:33:0D:7D:0E
I/解析器 (10860): StringBuilder.getString() = 58:6D:8F:BA:F5:81 | parser_mac = 58:6C:8E:A0:E5:81
I/PARSER (10860):StringBuilder.getString() = AC:22:0B:40:70:41 | parser_mac = 0B:22:0A:40:70:41
我的下一个问题是……为什么它们不匹配?感谢您提出的任何想法。