如何将不可打印的字符或字符串转换为十六进制?

时间:2011-01-24 22:07:17

标签: java string hex

我有包含下一个十六进制演示文稿的String: “5f e8 d0 7b c0 f7 54 07 fb e4 20 f5 b8 10 67 a9”

您理解这只是十六进制,我需要从String中获取此十六进制表示。字符串看起来像: “ED> @@ 2.W.W'KJ%z_ {T g”

那么,如何从“ED> @@ 2.W.W'KJ%z_ {T g”十六进制演示“5f e8 d0 7b c0 f7 54 07 fb e4 20 f5 b8 10 67 a9”获得?这是不可打印的字符所以我不能使用这个:

    public static String stringToHex(String arg) {
        return String.format("%x", new BigInteger(arg.getBytes()));
    }
结果:-10404282104042104042104042104042104042c7eea21040428189104042104042f5。 这也让我有些奇怪:
System.out.println(String.format("%h", Integer.toHexString(buff.charAt(0))));
结果:6d1。

这段代码有时会起作用。数据来自socket(作为String,因为我需要获得许多答案为String,只有这个Auth Challenge为hex)。

1 个答案:

答案 0 :(得分:4)

这是正确的解决方案:

public static String toHexString(byte[] bytes) {  
    StringBuilder out = new StringBuilder();
    for (byte b: bytes) {
        out.append(String.format("%02X", b) + " ");
    }
    return out.toString();
}

Integer.toHexString()解决方案错误的原因如下:

  1. 它不会将前导零添加到字节0x01 - 0x0F
  2. 它将字节0x80 - 0xFF打印为2的补码表示中的负整数