Java - 字符串中的字节数组

时间:2011-06-28 12:45:26

标签: java arrays byte hex

  

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

例如,我有一个字符串“DEADBEEF”。如何将其转换为byte [] bytes = {0xDE,0xAD,0xBE,0xEF}?

4 个答案:

答案 0 :(得分:6)

遍历每对两个字符并分别转换每对:

byte[] bytes = new byte[str.length()/2];

for( int i = 0; i < str.length(); i+=2 )
    bytes[i/2] = ((byte)Character.digit(str.charAt(i),16))<<4)+(byte)Character.digit(str.charAt(i),16);

我没有测试过这段代码(我没有编译器和我一起)但是我希望我能通过这个想法。减法/加法简单地将'A'转换为数字10,将'B'转换为11等。比特移位&lt;&lt; 4将第一个十六进制数字移动到正确的位置。

编辑:重新考虑一下之后,我不确定你是否在问正确的问题。您想将“DE”转换为{0xDE},还是转换为{0x44,0x45}?后者更有用,前者更像是家庭作业问题类型的问题。

答案 1 :(得分:3)

getBytes()可以获得平台编码中字符的字节数。但是,您似乎想要将包含字节的十六进制表示的String转换为实际表示的字节数组。

在这种情况下,我会指出你现在的问题:Convert a string representation of a hex dump to a byte array using Java?(注意:我个人更喜欢使用commons-codec的第二个答案,但更多出于哲学原因)

答案 2 :(得分:2)

您可以将字符串解析为long,然后提取字节:

String s = "DEADBEEF";
long n = Long.decode( "0x" + s );  //note the use of auto(un)boxing here, for Java 1.4 or below, use Long.decode( "0x" + s ).longValue();
byte[] b = new byte[4];
b[0] = (byte)(n >> 24);
b[1] = (byte)(n >> 16);
b[2] = (byte)(n >> 8);
b[3] = (byte)n;

答案 3 :(得分:1)

tskuzzy的答案可能是正确的(没有测试),但如果可以的话,我建议使用Apache的Commons Codec。它有一个Hex类,可以满足你的需要。