【问题标题】:How to convert non-printable character or string to hex?如何将不可打印的字符或字符串转换为十六进制?
【发布时间】:2011-01-24 22:07:17
【问题描述】:

我有包含下一个十六进制表示的字符串: "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。

而且这段代码有时有效。数据来自套接字(作为字符串,因为我需要以字符串形式获得许多答案,而只有这个 Auth Challenge 作为十六进制)。

【问题讨论】:

  • 这有什么作用? System.out.println(Integer.toHexString(buff.charAt(0)));
  • 您的问题不清楚。您是否有一个包含字符“5”、后跟“f”、后跟一个空格、后跟“e”等的字符串,或者您是否有一个包含字节 0x5F、0xE8 等的字符串?
  • 我有带有不可打印字符的字符串。十六进制上部是字符串的十六进制表示。
  • fd, «6d1» 是调用的结果。
  • 叹息。您将数据从套接字(字节)转换为字符串(字符)并想要重新创建数据?您的数据已经损坏。字符串使用bytes 对chars 进行编码。根据您的平台默认编码,一些多字节序列已经被吃掉并变成了单个chars。在 c/c++ 中,字符:=字节。在 Java 中它们不是。

标签: java string hex


【解决方案1】:

这是正确的解决方案:

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 的补码表示的负整数

【讨论】:

  • 为什么不在格式字符串"%02X "里面加空格?
猜你喜欢
  • 2013-02-07
  • 2018-01-31
  • 1970-01-01
  • 2016-08-09
  • 2020-06-23
  • 2017-08-23
  • 2014-03-19
  • 2019-07-27
相关资源
最近更新 更多