我正在尝试将一个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个字节答案 0 :(得分:0)
如果我理解正确,你试图将一个字节序列(以十六进制表示法给出为字符串)转换为相应的字符。
您可以使用DatatypeConverter
类将十六进制字符串转换为字节数组...
byte[] bytes = DatatypeConverter.parseHexBinary(inputString);
...并将每个字节转换为它代表的字符:
StringBuilder outputStringBuilder = new StringBuilder();
for (byte currentByte : bytes) {
outputStringBuilder.append((char) currentByte);
}
答案 1 :(得分:0)
嗯,第二次尝试的问题是你一次读取两个十六进制字符(这是正确的,因为每对十六进制字符是一个字节),但你的循环条件和增量是错误的。
试试这个:
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < input.length()/2; i+=2) {
String s = input.substring(i, i + 2);
byte value = Byte.valueOf(s, 16);
sb.append(value);
}
此外,您还应检查输入是否具有偶数个十六进制字符。