-4

我有一个包含十六进制数字的字符串但我想将它们解码为文本并将它们转换为字符串

如果我的字符串是“FF505000010000000A00015634”它们是十六进制的,我如何使它们成为 \xFF \x50... 等等

请在这里帮助我

4

3 回答 3

3

尝试

    String s = "FF505000010000000A00015634";
    s = s.replaceAll(" +", "");
    byte[] bytes =  new BigInteger(s, 16).toByteArray();
于 2013-01-07T09:28:59.227 回答
1

将文本作为十六进制字符串转换为文本的一种简单方法是使用 BigInteger。

String s = "Hello world!";
String hex = new BigInteger(s.getBytes(StandardCharsets.US_ASCII)).toString(16);

hex = hex.replaceAll("\\s+", ""); // remove any whitespaces.
String s2 = new String(new BigInteger(hex, 16).toByteArray(), StandardCharsets.US_ASCII);
System.out.printf("\"%s\" as hex is %s, converted back is \"%s\"%n", s, hex, s2);

印刷

“你好世界!” 因为十六进制是 48656c6c6f20776f726c6421,转换回来是“Hello world!”

于 2013-01-07T09:31:50.297 回答
0

这应该有效。你基本上得到每两个字符,并将其解析为一个int,也可以解释为一个char。由此,您构建另一个解码String的 .

String s = "FF505000010000000A00015634";
if (s.length() % 2 != 0) {
    //odd amount, so wrong string. Throw exception.
}
String decoded = "";
int j = 0;
while (j < s.length()) {
    String sub = s.substring(j, j + 2);
    int i = Integer.parseInt(sub, 16);
    decoded += (char)i;
    j += 2;
}
System.out.println(decoded);

我的输出非常随机,但我认为您的测试字符串并不是那么好。

对于Hello world!,使用这个:

String s = "48 65 6C 6C 6F 20 57 6F 72 6C 64 21";
s = s.replaceAll(" ", "");

那么实际发生了什么:

  1. 每两个字符应解释为一个字符。
  2. 因此,将String两个字符分成几部分。
  3. 将每两个十六进制字符转换为实际int值,从而可以进行实际转换。
  4. 将每个从十六进制到 ASCII 解码的字符附加到您的新解码的String.
  5. 重复,直到所有字符都包含在 hex 中String
于 2013-01-07T09:23:57.480 回答