可能重复:
Convert a string representation of a hex dump to a byte array using Java?
我想将字符串"1B4322C2"
转换为字节,但问题是如果我使用getBytes()
它会将其转换为字符串长度加倍的字节,我想将它们转换为字符串长度的一半
e.g。上述字符串的输出应为{0x1B , 0x43, 0x22, 0xC2}
谢谢
答案 0 :(得分:5)
(我现在投票决定以副本结束,我应该首先完成...但是在这里留下这个答案直到问题被删除是有意义的。)
是的,所以实际想要做的就是解析一个十六进制字符串。
你应该查看Apache Commons Codec,其中有Hex
类正是为了这个目的。就个人而言,我对API并不满意,但这应该有效:
Hex hex = new Hex();
byte[] data = (byte[]) hex.decode(text);
或者:
byte[] data = Hex.decodeHex(text.toCharArray());
(就我个人而言,我希望你可以使用byte[] data = Hex.decodeHexString(text);
,但我们去......如果你愿意的话,你总是可以编写自己的包装方法。)
如果您不想使用第三方库,Stack Overflow上的其他地方有很多实现,例如: this one
答案 1 :(得分:2)
将“1B4322C2”编码为可以使用的字节
byte[] bytes = new BigInteger("FB4322C2", 16).toByteArray();
if (bytes.length > 1 && bytes[0] == 0)
bytes = Arrays.copyOfRange(bytes, 1, bytes.length);
System.out.println(Arrays.toString(bytes));
打印
[-5, 67, 34, -62]
答案 2 :(得分:1)
您可以使用String Tokenizer或String Builder并分离字符串,然后将其从hexa转换为字符串......
此链接可能对您有所帮助。
Convert Hex to ASCII
希望这会有所帮助..
答案 3 :(得分:1)
如果你不想使用外部lib,这应该做一些调整(添加0x和{})
public static String byteArrayToHexadecimal(byte[] raw) {
final BigInteger bi = new BigInteger(1, raw);
final String result = bi.toString(16);
if (result.length() % 2 != 0) {
return "0" + result;
}
return result;
}
对不起,反过来(没有任何优化,因为它对我来说根本不是瓶颈):
public static byte[] hexadecimalToByteArray(String hex) {
if (hex.length() % 2 != 0) {
hex = "0" + hex;
}
final byte[] result = new byte[hex.length() / 2];
for (int i = 0; i < hex.length(); i += 2) {
String sub = "0x" + hex.substring(i, i + 2);
result[i / 2] = (byte) ((int) Integer.decode(sub));
}
return result;
}
我建议按照J. Skeet的建议去寻找Apache Commons Codec
答案 4 :(得分:0)
getBytes
将每个字符转换为字节形式的字符代码;它不解析字符串本身的字节值。为此,您可能需要编写自己的解析函数。
答案 5 :(得分:0)
您不需要String.getBytes()方法。这将把字符串的字符转换为字节表示。
要执行您要执行的操作,您需要手动将字符串拆分为单个字符串,每对一个字符串。然后,你将要解析它们。
不幸的是,Java没有无符号字节,0xC2会溢出。如果内存不是问题,你可能会想要将值视为短路或整数。
因此,您可以使用Integer类将字符串解析为数字。由于你的字符串是十六进制的,你必须使用允许你提供基数的解析方法。
String test = "1B4322C2";
for (int bnum = 0; bnum < test.length() / 2; bnum++) {
String bstring = test.substring(bnum * 2, bnum * 2 + 2);
int bval = Integer.parseInt(bstring, 16);
System.out.println(bstring + " -> " + bval);
}
这将输出:
1B -> 27
43 -> 67
22 -> 34
C2 -> 194
如果在数组中需要它们,则可以实例化一个字符串宽度的一半的数组,并将每个值放在其bnum
索引下。