所以我有一段代码,它把二进制文件中的字节[]转换成int[],然后再转换成字符串。
例如:02 09 1A将翻译成 "2926",使用的是 String.valueOf(byte);
但这就是有趣的地方:旧的Code在数组变成String之前就已经把数组拆开了,所以这并不重要。现在,我的代码需要以某种方式找出是否有2 9或29... 我怎样才能让字符串--保持十六进制,而不是 "切换 "到十进制,并且--在字符串中保留零,这样我就可以随时抓住接下来的两个字符,找出它们显示的信息,然后继续?输入:05 06 1D 11 07 08 01 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的,而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
字节 至 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