【问题标题】:Java - byte array from string [duplicate]Java - 字符串中的字节数组[重复]
【发布时间】:2011-09-24 07:08:13
【问题描述】:

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

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

【问题讨论】:

  • 为什么人们不使用 API? :[
  • 您是在尝试将字符串转换为十六进制,还是转换为 ASCII 字节? “DEADBEEF”的 ASCII 字节不是 { 0xDE, 0xAD, 0xBE, 0xEF }
  • 他没有说ASCII——为什么每个人都认为他想要ASCII?这就是您在阅读后 3 秒内回答问题所获得的结果。
  • @alexcoco - 鉴于没有人真正知道这个人在问什么,而且 OP 也没有澄清,尼克对每个人都非常苛刻。

标签: java arrays byte hex


【解决方案1】:

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

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);

我还没有测试过这段代码(我的 atm 没有编译器),但我希望我能理解这个想法。减法/加法只是将“A”转换为数字 10,将“B”转换为 11,等等。位移

编辑:经过重新思考后,我不确定您是否提出了正确的问题。您想将“DE”转换为 {0xDE} 还是转换为 {0x44,0x45} ?后者比较好用,前者更像是作业题型的题。

【讨论】:

  • + 1是的——有人回答了这个问题!
  • 为什么后者会更有用?第一个是标准的十六进制编码。我很难找到适合您“更好”解释的问题。
  • @musiKk:后者称为“ASCII编码”,而不是“十六进制解码”。
  • @tskuzzy:-1。此代码专用于输入 - 它仅适用于十六进制数字 AF,而不适用于普通的 09(也出现在十六进制数字中)。最好使用Character.digit(c, 16) 而不是你的c - 'A' + 10。 (请在解决此问题后发表评论,我将撤消我的反对意见。)
  • @musiKk:哦,没关系,你是对的。我更多地考虑以这种方式转换任意字符串(例如“QWERTY”)(这显然没有意义)。
【解决方案2】:

getBytes() 将为您获取平台编码中字符的字节数。但是,听起来您想将包含字节十六进制表示的字符串转换为实际表示的字节数组。

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

【讨论】:

    【解决方案3】:

    您可以将字符串解析为 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;
    

    【讨论】:

    • 这在这种情况下有效,但通常仅适用于长度不超过 16 个十六进制数字(即 8 个解码字节)的字符串。
    • @Paulo 确实如此,但如果需要,您可以将字符串分成 16 个字符的批次。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 2011-12-14
      • 2017-09-21
      • 2017-06-15
      • 2011-10-04
      • 2016-11-15
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多