如何将字节转换为显示其十六进制值的字符串 (0x0e -> "0E")
How to convert a byte into a String that displays its hex value (0x0e -> "0E")
所以我有一段代码,它将 byte[] 从二进制文件转换为 int[],然后再将其转换为 String。
示例:02 09 1A 将使用 String.valueOf(byte);
转换为“2926”
但这就是有趣的开始:旧代码在数组变成字符串之前就已经拆分了数组,所以这无关紧要。现在我有代码需要以某种方式弄清楚是否有 2 9 或 29...我怎样才能得到字符串
- 保持十六进制而不是 "switching" 到十进制和
- 保留字符串中的零
这样我就可以随时抓住接下来的两个字符,找出它们显示的信息并继续?
输入:
05 06 1D 11 07 08 01 32 21 28 2F 20 2E 21 34 22 25 33 01 02 09 0A FF 0B 0C
2!(/ .!4"%3
ÿ
当前输出:562917781503340473246335234375112910-11112
预期输出:05061D110708013221282F202E21342225330102090AFF0B0C
(没有把我的旧代码放在这里,因为它基于 int 是废话)
如果我没理解错的话,你有一个 byte[]
作为输入,你想输出一个由所有这些字节组成的字符串,以十六进制形式连接在一起:
private static String byteArrayToString(byte[] byteArray) {
StringBuilder builder = new StringBuilder();
for (byte b : byteArray) {
int i = Byte.toUnsignedInt(b);
if (i < 16) {
builder.append("0");
}
builder.append(Integer.toHexString(i).toUpperCase());
}
return builder.toString();
}
注意 Byte.toUnsignedInt
的用法。这会将 -1
byte 之类的东西转换为 int
0xff
。这是必需的,因为 Java 的字节已签名。
还要注意我用 0
填充的地方。我只在字节是十六进制的单个数字时才这样做。 i < 16
是检查这个的条件。
另一种方式:
char[] hexVals = {'0', '1','2','3','4','5','6','7','8','9','A', 'B','C','D','E','F'};
byte[] bytes = {5, 6, (byte)0xAB, (byte)0xde}; // sample input
char[] output = new char[bytes.length*2];
// split each byte's hex digits into two chars
for(int i=0; i < bytes.length; i++) {
output[2*i] = hexVals[(bytes[i] >> 4) & 0xf]; // HO nibble
output[2*i+1] = hexVals[bytes[i] & 0xf]; // LO nibble
}
System.out.println(new String(output)); // 0506ABDE
所以我有一段代码,它将 byte[] 从二进制文件转换为 int[],然后再将其转换为 String。
示例:02 09 1A 将使用 String.valueOf(byte);
但这就是有趣的开始:旧代码在数组变成字符串之前就已经拆分了数组,所以这无关紧要。现在我有代码需要以某种方式弄清楚是否有 2 9 或 29...我怎样才能得到字符串
- 保持十六进制而不是 "switching" 到十进制和
- 保留字符串中的零
这样我就可以随时抓住接下来的两个字符,找出它们显示的信息并继续?
输入:
05 06 1D 11 07 08 01 32 21 28 2F 20 2E 21 34 22 25 33 01 02 09 0A FF 0B 0C
2!(/ .!4"%3
ÿ
当前输出:562917781503340473246335234375112910-11112
预期输出:05061D110708013221282F202E21342225330102090AFF0B0C
(没有把我的旧代码放在这里,因为它基于 int 是废话)
如果我没理解错的话,你有一个 byte[]
作为输入,你想输出一个由所有这些字节组成的字符串,以十六进制形式连接在一起:
private static String byteArrayToString(byte[] byteArray) {
StringBuilder builder = new StringBuilder();
for (byte b : byteArray) {
int i = Byte.toUnsignedInt(b);
if (i < 16) {
builder.append("0");
}
builder.append(Integer.toHexString(i).toUpperCase());
}
return builder.toString();
}
注意 Byte.toUnsignedInt
的用法。这会将 -1
byte 之类的东西转换为 int
0xff
。这是必需的,因为 Java 的字节已签名。
还要注意我用 0
填充的地方。我只在字节是十六进制的单个数字时才这样做。 i < 16
是检查这个的条件。
另一种方式:
char[] hexVals = {'0', '1','2','3','4','5','6','7','8','9','A', 'B','C','D','E','F'};
byte[] bytes = {5, 6, (byte)0xAB, (byte)0xde}; // sample input
char[] output = new char[bytes.length*2];
// split each byte's hex digits into two chars
for(int i=0; i < bytes.length; i++) {
output[2*i] = hexVals[(bytes[i] >> 4) & 0xf]; // HO nibble
output[2*i+1] = hexVals[bytes[i] & 0xf]; // LO nibble
}
System.out.println(new String(output)); // 0506ABDE