2013-01-07 54 views
-4

我有一个包含十六进制数 但我想对其进行解码,以文本,并将其转换为字符串如何编码字符串为byte []

如果我的字符串为“FF505000010000000A00015634” 他们是一个字符串在十六进制,如何让他们\ XFF \ X50 ...等

请帮我在这里

+0

你的问题不清楚。 –

+1

给出一个输入/输出示例。你可以使用'str = str.replaceAll(“\\ s +”,“”);' – jlordo

+0

来删除空格你能提供一个真正的文本作为十六进制字符串吗?因为FF505000010000000A00015634不像ASCII文本那样编码为十六进制。 –

回答

3

尝试

String s = "FF505000010000000A00015634"; 
    s = s.replaceAll(" +", ""); 
    byte[] bytes = new BigInteger(s, 16).toByteArray(); 
+0

netbeans告诉我为BigInteger创建一个类? – junyi00

+1

我不确定netbeans,但java.math.BigInteger自版本1.0起属于Java SE –

+0

oops,忘记导入。谢谢,我要去测试 – junyi00

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. 重复上述操作,直至得到十六进制的所有字符String
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!”