【问题标题】:Hex-encoded String to Byte Array十六进制编码字符串到字节数组
【发布时间】:2011-10-02 19:12:03
【问题描述】:
String str = "9B7D2C34A366BF890C730641E6CECF6F";

我想将str 转换为字节数组,但str.getBytes() 返回的是 32 个字节而不是 16 个。

【问题讨论】:

  • 这根本不是错误。
  • 一些有效的java代码会有所帮助...
  • @Andreas_D:看看 OP 的问题。字符串有 32 个字符。此外 String.getBytes() 不会将字符串的内部表示形式返回为字节。它以字节数组的形式返回字符串,使用默认的平台编码(可能是 UTF8、ISO8859-1、CP-1252、...,每个 ASCII 字符使用 1 个字节)
  • @JB Nizet - 问题不包括有效的 Java 代码,它是 my 解释 stringy thing 是一个 16 字节整数值十六进制格式。 (这就是我在第一条评论中推荐valid java code的原因)
  • 好的。明白了。没有正确的问题,很难给出正确的答案。

标签: java arrays string bytearray


【解决方案1】:

我认为提问者的目的是将十六进制值的字符串表示形式转换为表示该十六进制值的字节数组。

apache commons-codec 有一个类,Hex

String s = "9B7D2C34A366BF890C730641E6CECF6F";    
byte[] bytes = Hex.decodeHex(s.toCharArray());

【讨论】:

  • 还有org.bouncycastle.util.encoders.Hex可以做这种工作。
  • 请考虑您将不得不“自己动手”。那么什么是示例方法?
【解决方案2】:

Java SE 6 或 Java EE 5 现在提供了执行此操作的方法,因此无需额外的库。

方法是DatatypeConverter.parseHexBinary

这种情况下可以这样使用:

String str = "9B7D2C34A366BF890C730641E6CECF6F";
byte[] bytes = DatatypeConverter.parseHexBinary(str);

该类还为 XML 中常用的许多其他格式提供类型转换。

【讨论】:

  • 迄今为止我遇到的这个问题最简单的解决方案 - 谢谢!
  • 这应该是公认的答案,因为它是仅使用核心 Java 库的最简单的解决方案。
【解决方案3】:

用途:

str.getBytes("UTF-16LE");

【讨论】:

  • 它提供类似 [B@405e898 的输出,但我想要与字节数组相同的 Str 字符串。
  • @Qaiser Mehmood 因为它是一个数组,所以你不能只打印它,你必须做一个简单的循环来逐个打印它的元素
  • 类似:for(byte b : str.getBytes("UTF-16LE")) System.out.println(b);
  • 这不会将十六进制字符串转换为相应的字节。这会将任何字符串转换为其 UTF16 编码。顺便说一句,使用 OP 的示例字符串,它将吐出 64 个字节,这完全不是所要求的。
【解决方案4】:

我知道它已经晚了,但希望它会帮助别人......

这是我的代码:它采用包含在 String 中的二乘二十六进制表示并将它们添加到字节数组中。 它非常适合我。

public byte[] stringToByteArray (String s) {
    byte[] byteArray = new byte[s.length()/2];
    String[] strBytes = new String[s.length()/2];
    int k = 0;
    for (int i = 0; i < s.length(); i=i+2) {
        int j = i+2;
        strBytes[k] = s.substring(i,j);
        byteArray[k] = (byte)Integer.parseInt(strBytes[k], 16);
        k++;
    }
    return byteArray;
}

【讨论】:

    【解决方案5】:

    这应该可以解决问题:

    byte[] bytes = toByteArray(Str.toCharArray());
    
    public static byte[] toByteArray(char[] array) {
        return toByteArray(array, Charset.defaultCharset());
    }
    
    public static byte[] toByteArray(char[] array, Charset charset) {
        CharBuffer cbuf = CharBuffer.wrap(array);
        ByteBuffer bbuf = charset.encode(cbuf);
        return bbuf.array();
    }
    

    【讨论】:

      【解决方案6】:

      试试这个:

           String str = "9B7D2C34A366BF890C730641E6CECF6F";
           String[] temp = str.split(",");
           bytesArray = new byte[temp.length];
           int index = 0;
           for (String item: temp) {
           bytesArray[index] = Byte.parseByte(item);
           index++;
           }
      

      【讨论】:

        【解决方案7】:

        我假设您需要将一个十六进制字符串转换为一个字节数组,该数组与该十六进制字符串的含义相同吗? 添加此方法应该为您完成,无需任何额外的库导入:

        public static byte[] hexToByteArray(String s) {
             String[] strBytes = s.split("(?<=\\G.{2})");
             byte[] bytes = new byte[strBytes.length];
             for(int i = 0; i < strBytes.length; i++)
                 bytes[i] = (byte)Integer.parseInt(strBytes[i], 16);
             return bytes;
        }
        

        【讨论】:

          猜你喜欢
          • 2020-03-04
          • 2013-08-09
          • 2013-10-13
          • 1970-01-01
          • 2011-10-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多