【问题标题】:convert a 32-byte hex string into a 16-byte string of hex values将 32 字节的十六进制字符串转换为 16 字节的十六进制值字符串
【发布时间】:2013-10-03 21:08:14
【问题描述】:

我正在尝试将 32 字节的十六进制字符串 (b8aa30d8f1d398883f0eeb5079777c42) 转换为 16 字节的十六进制值字符串 (x'b8aa30d8f1d398883f0eeb5079777c42')

我已经尝试了一些我在这里找到的建议。

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < input.length(); i++) {
        String s = input.substring(i, i + 2);       
        byte value = Byte.valueOf(s, 16);
                       sb.append(value);
    }

这导致了这个异常:值超出范围。值:"b8" 基数:16

         String bin = "";
    String binFragment = "";
    int iHex;
    hex = hex.trim();
    hex = hex.replaceFirst("0x", "");

    for(int i = 0; i < hex.length(); i++){
        iHex = Integer.parseInt(""+hex.charAt(i),16);
        binFragment = Integer.toBinaryString(iHex);

        while(binFragment.length() < 4){
            binFragment = "0" + binFragment;
        }
        bin += binFragment;
    }

这不能正确处理前导 0

有人有办法进行这种转换吗?

我也试过这个:

public static void convert() {
    String s = "0c871eea3af7526f9b2e7054f6277984";
    byte[] bytes = DatatypeConverter.parseHexBinary(s);
    StringBuilder outputStringBuilder = new StringBuilder();
    for (byte currentByte : bytes) {
        outputStringBuilder.append((char) currentByte);
    }
    System.out.println(String.format("%s, %s", bytes, bytes.length));
    String out = bytes.toString();
    System.out.println(String.format("%s, %s", out, out.length()));
}

并得到以下结果: [B@f01a1e, 16 [B@f01a1e, 9

在创建输出字符串之前,字节数组中有 16 个字节,但之后只有 9 个。

【问题讨论】:

  • "十六进制值的字节串。"这没有任何意义。
  • 请发布更多输入和输出示例,并且字节已签名,因此 b8 太大而无法放入一个字节
  • Integer.toBinaryString() 会将整数转换为由 0 和 1 组成的字符串,它们是该整数的二进制表示。那是你真正想要的吗?你不会得到一个 16 字节的字符串,你会得到一个 128 字节的 0 和 1 字符串。也许您想将 32 字节十六进制字符串转换为字节数组?这会给你一个 16 字节的二进制数组。
  • 请不要使用StringBuffer,你可以使用StringBuilder。
  • 标题令人困惑。您真正要问的是“如何将数字从 32 个字符的十六进制字符串转换为 16 个元素的 byte[] 数组?”为此,我认为您可能应该使用 ByteBuffer 类,它是 java.nio 库的一部分。

标签: java hex


【解决方案1】:

如果我理解正确,您正在尝试将字节序列(以十六进制表示法作为字符串给出)转换为相应的字符。

您可以使用DatatypeConverter 类将十六进制字符串转换为字节数组...

byte[] bytes = DatatypeConverter.parseHexBinary(inputString);

...并将每个字节转换为它所代表的字符:

StringBuilder outputStringBuilder = new StringBuilder();
for (byte currentByte : bytes) {
    outputStringBuilder.append((char) currentByte);
}

【讨论】:

  • 不过,这会为您的输入产生垃圾 (ᄌᆰ0￘￱ᅮリネ?→Pyw|B),所以我不确定您是否正在尝试实现其他目标。
【解决方案2】:

好吧,您第二次尝试的问题是您一次读取两个十六进制字符(这是正确的,因为每对十六进制字符都是一个字节),但是您的循环条件和增量是错误的。

试试这个:

StringBuilder sb = new StringBuilder ();
for (int i = 0; i < input.length()/2; i+=2) {
    String s = input.substring(i, i + 2);       
    byte value = Byte.valueOf(s, 16);
                   sb.append(value);
}

此外,您还应该检查输入是否包含偶数个十六进制字符。

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2017-08-23
    • 2023-03-07
    • 2022-06-18
    • 2017-06-17
    • 2014-03-10
    • 2012-01-24
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多