【发布时间】:2013-10-03 21:08:14
【问题描述】:
我正在尝试将 32 字节的十六进制字符串 (b8aa30d8f1d398883f0eeb5079777c42) 转换为 16 字节的十六进制值字符串 (x'b8aa30d8f1d398883f0eeb5079777c42')
我已经尝试了一些我在这里找到的建议。
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
String s = input.substring(i, i + 2);
byte value = Byte.valueOf(s, 16);
sb.append(value);
}
这导致了这个异常:值超出范围。值:"b8" 基数:16
String bin = "";
String binFragment = "";
int iHex;
hex = hex.trim();
hex = hex.replaceFirst("0x", "");
for(int i = 0; i < hex.length(); i++){
iHex = Integer.parseInt(""+hex.charAt(i),16);
binFragment = Integer.toBinaryString(iHex);
while(binFragment.length() < 4){
binFragment = "0" + binFragment;
}
bin += binFragment;
}
这不能正确处理前导 0
有人有办法进行这种转换吗?
我也试过这个:
public static void convert() {
String s = "0c871eea3af7526f9b2e7054f6277984";
byte[] bytes = DatatypeConverter.parseHexBinary(s);
StringBuilder outputStringBuilder = new StringBuilder();
for (byte currentByte : bytes) {
outputStringBuilder.append((char) currentByte);
}
System.out.println(String.format("%s, %s", bytes, bytes.length));
String out = bytes.toString();
System.out.println(String.format("%s, %s", out, out.length()));
}
并得到以下结果: [B@f01a1e, 16 [B@f01a1e, 9
在创建输出字符串之前,字节数组中有 16 个字节,但之后只有 9 个。
【问题讨论】:
-
"十六进制值的字节串。"这没有任何意义。
-
请发布更多输入和输出示例,并且字节已签名,因此 b8 太大而无法放入一个字节
-
Integer.toBinaryString()会将整数转换为由 0 和 1 组成的字符串,它们是该整数的二进制表示。那是你真正想要的吗?你不会得到一个 16 字节的字符串,你会得到一个 128 字节的 0 和 1 字符串。也许您想将 32 字节十六进制字符串转换为字节数组?这会给你一个 16 字节的二进制数组。 -
请不要使用StringBuffer,你可以使用StringBuilder。
-
标题令人困惑。您真正要问的是“如何将数字从 32 个字符的十六进制字符串转换为 16 个元素的 byte[] 数组?”为此,我认为您可能应该使用 ByteBuffer 类,它是 java.nio 库的一部分。