【问题标题】:Java convert String of byte array to byte arrayJava将字节数组的字符串转换为字节数组
【发布时间】:2017-06-08 10:34:10
【问题描述】:

我得到了一个通过 ajax 从 javascript 发送的字节数组,如下所示:

"89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00 ..."

我想将此字符串转换为字节数组。 非常类似于这个问题,但使用 Java 代替:Convert String[] to byte[] array

编辑: 这似乎有效 - 但不确定我是否做得对

    String[] byteData ="89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00";
    byte[] b = new byte[byteData.length];
    for (int i = 0; i < byteData.length; i++) {
        BigInteger bla = BigInteger.valueOf(Integer.parseInt(byteData[i].trim(), 16) - 128);
        b[i] = bla.toByteArray()[0];
    }

【问题讨论】:

  • 您自己尝试过任何代码吗?
  • 你有String(byte[]),你只需要读取字符串,逐个解码字节来创建byte[],如果不能,请尝试返回。
  • 一般流程是String::split在逗号处,写一个转换hexToDec()函数,从结果中减去128,然后转换为byte。 Java 中没有 uByte 这样的东西,这就是为什么你需要从结果中减去 128

标签: java arrays byte


【解决方案1】:

你可以试试这个

String response ="89,50,47,00,00,00,49,48,44,52,00,00,01,98,00,00,00,08";

List<Byte> byteList = Arrays.stream(response.split(","))
   .map(Byte::parseByte)
   .collect(Collectors.toList());

与之前相同,但使用流 xD

但是您的示例在 4e、0d 等上抛出 NumberFormatException

【讨论】:

  • OP 想要一个字节数组,而不是 List&lt;Byte&gt;
  • eehm NumberFormatException xD
  • @JacobG。您可以使用 .toArray(Byte[]::new) 而不是 .collect(Collectors.toList())
  • @sofarsoghood 你确定 dat 字符串吗? 100% 有效吗?
  • @sofarsoghood 你试过 response.getBytes() 吗?它从字符串返回 byte[]
【解决方案2】:

这是一个简单的 JAVA 解决方案:

        String bytes="89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08";
        String []tab=bytes.split(",");
        Integer []b = new Integer[tab.length];
        for(int i = 0 ; i < tab.length ; i++){
             if(tab[i].matches("[-+]?\\d*\\.?\\d+"))
                 b[i]=Integer.parseInt(tab[i]);
             else
                 b[i]=Integer.parseInt(tab[i],16);


        }

【讨论】:

  • java.lang.NumberFormatException:对于输入字符串:b[i]=Byte.parseByte(tab[i]);处的“4e”
  • 我编辑了答案,这将解决问题:b[i]=Byte.parseByte(tab[i],16);
  • 不幸的是这会导致问题:Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"89" Radix:16
  • hmm java.lang.NumberFormatException:值超出范围。值:“89”基数:16 b[i]=Byte.parseByte(tab[i],16);:/
  • 所以我们必须测试字符串是否为数字,如果不是,您将其解析为十六进制,现在试试吧:) if(tab[i].matches("[-+]?\\d*\\.?\\d+")) b[i]=Byte.parseByte(tab[i]); else b[i]=Byte.parseByte(tab[i],16);
【解决方案3】:

试试下面的代码(输出是转换的结果):

    String input = "89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08";

    String[] hex = input.split(",");
    char[] chars = new char[hex.length];
    for (int i = 0; i < hex.length; i++) {
        chars[i] = (char) Integer.parseInt(hex[i], 16);
    }
    String output = new String(chars);

【讨论】:

    【解决方案4】:

    编辑:实际上 parseByte 对于您的情况似乎不是一个安全的选择,因为 this,所以我从 this answer 获得灵感来更改它。

    你可以这样做:

    String bytesAsStringWithCommas = "89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00 ...";
    String[] bytesStr = bytesAsStringWithCommas.split(",");
    byte[] byteArray = new byte[bytesStr.length];
    for (int j = 0; j < bytesStr.length; j++) {
        byteArray[j] = (byte) ((Character.digit(bytesStr[j].charAt(0), 16) << 4) + Character.digit(bytesStr[j].charAt(1), 16));
    }
    

    您可能应该更改您的服务器代码或客户端代码以直接发送数据,而不是使用像这样的复杂解决方案。或者您也可以使用 Base64 编码,这已经比您当前的解决方案更好。

    【讨论】:

    • parseByte 需要第二个参数 16。
    • 你完全正确,谢谢。但我发现 parseByte 实际上并不是一个很好的选择(见编辑)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2013-12-19
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多