我想将字符串转换"1B4322C2"
为字节,但问题是如果我使用getBytes()
它会将其转换为字符串长度两倍的字节,并且我想将它们转换为字符串长度的一半。
例如上述字符串的输出应该是{0x1B , 0x43, 0x22, 0xC2}
谢谢你
我想将字符串转换"1B4322C2"
为字节,但问题是如果我使用getBytes()
它会将其转换为字符串长度两倍的字节,并且我想将它们转换为字符串长度的一半。
例如上述字符串的输出应该是{0x1B , 0x43, 0x22, 0xC2}
谢谢你
(I've now voted to close as a duplicate, which I should have done first... but it makes sense to leave this answer here until the question is deleted...)
Right, so what you actually want to do is parse a hex string.
You should look at Apache Commons Codec, which has a Hex
class for precisely that purpose. Personally I'm not wild about the API, but this should work:
Hex hex = new Hex();
byte[] data = (byte[]) hex.decode(text);
Or:
byte[] data = Hex.decodeHex(text.toCharArray());
(Personally I wish you could just use byte[] data = Hex.decodeHexString(text);
but there we go... you could always write your own wrapper method if you want.)
If you don't want to use a 3rd party library, there are plenty of implementations elsewhere on Stack Overflow, e.g. this one.
要将“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]
如果您不想使用外部库,这应该通过一些调整来解决问题(添加 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
您可以使用 String Tokenizer 或 String Builder 并分离字符串,然后将其从六进制转换为字符串...
此链接可能对您有帮助..
将十六进制转换为 ASCII
希望这可以帮助..
getBytes
将每个字符转换为字节形式的字符代码;它不会从字符串本身解析出字节值。为此,您可能需要编写自己的解析函数。
您不想要 String.getBytes() 方法。这会将字符串的字符转换为它们的字节表示形式。
要执行您想要执行的操作,您需要手动将字符串拆分为单独的字符串,每对一个字符串。然后,您将要解析它们。
不幸的是,Java 没有无符号字节,而且 0xC2 会溢出。如果内存不是问题,您可能会希望将这些值视为短裤或整数。
因此,您可以使用 Integer 类将字符串解析为数字。由于您的字符串是十六进制的,因此您必须使用 parse 方法来提供基数。
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
索引下。