-1

可能重复:
使用 Java 将十六进制转储的字符串表示形式转换为字节数组?

我想将字符串转换"1B4322C2"为字节,但问题是如果我使用getBytes()它会将其转换为字符串长度两倍的字节,并且我想将它们转换为字符串长度的一半。

例如上述字符串的输出应该是{0x1B , 0x43, 0x22, 0xC2}

谢谢你

4

6 回答 6

5

(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.

于 2012-12-05T07:19:31.517 回答
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]
于 2012-12-05T09:11:56.807 回答
1

如果您不想使用外部库,这应该通过一些调整来解决问题(添加 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

于 2012-12-05T07:23:23.807 回答
1

您可以使用 String Tokenizer 或 String Builder 并分离字符串,然后将其从六进制转换为字符串...

此链接可能对您有帮助..
将十六进制转换为 ASCII

希望这可以帮助..

于 2012-12-05T07:19:27.810 回答
0

getBytes将每个字符转换为字节形式的字符代码;它不会从字符串本身解析出字节值。为此,您可能需要编写自己的解析函数。

于 2012-12-05T07:19:21.610 回答
0

您不想要 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索引下。

于 2012-12-05T07:32:44.120 回答