在String中将String转换为字节

时间:2012-12-05 07:13:39

标签: java byte bytebuffer

  

可能重复:
  Convert a string representation of a hex dump to a byte array using Java?

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

e.g。上述字符串的输出应为{0x1B , 0x43, 0x22, 0xC2}

谢谢

6 个答案:

答案 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索引下。