十六进制到ASCII显示不同的结果以纠正PHP实现

时间:2013-12-01 06:33:02

标签: java hex ascii bitcoin

我需要一种将hex转换为ascii的方法,而且大多数似乎是以下内容的变体:

public String hexToAscii(String hex) {
    StringBuilder sb = new StringBuilder();
    StringBuilder temp = new StringBuilder();
    for(int i = 0; i < hex.length() - 1; i += 2){
        String output = hex.substring(i, (i + 2));
        int decimal = Integer.parseInt(output, 16);
        sb.append((char)decimal);
        temp.append(decimal);
    }    
    return sb.toString();
}

想法是看

hexToAscii("51d37bdd871c9e1f4d5541be67a6ab625e32028744d7d4609d0c37747b40cd2d");

如果我打印出结果,我会

-Í@{t7?`Ô×D?2^b«¦g¾AUM??Ý{ÓQ.  

这不是我需要的结果。一位朋友在PHP中得到了正确的结果,这是以下字符串的反转:

QÓ{݇žMUA¾g¦«b^2‡D×Ô`7t{@Í-

有明显的字符表明他的hexToAscii函数是编码而我的不是。 不确定为什么会这样,但我怎样才能在Java中实现这个版本?

2 个答案:

答案 0 :(得分:0)

怎么样这样:

public static void main(String[] args) {
    String hex = "51d37bdd871c9e1f4d5541be67a6ab625e32028744d7d4609d0c37747b40cd2d";
    StringBuilder output = new StringBuilder();
    for (int i = 0; i < hex.length(); i+=2) {
        String str = hex.substring(i, i+2);
        output.append((char)Integer.parseInt(str, 16));
    }
    System.out.println(output);
}

答案 1 :(得分:0)

假设您的输入字符串为in,我会使用这样的方法

public static byte[] decode(String in) {
  if (in != null) {
    in = in.trim();
    List<Byte> bytes = new ArrayList<Byte>();
    char[] chArr = in.toCharArray();

    int t = 0;
    while (t + 1 < chArr.length) {
      String token = "" + chArr[t] + chArr[t + 1];
      // This subtracts 128 from the byte value.
      int b = Byte.MIN_VALUE
          + Integer.valueOf(token, 16);
      bytes.add((byte) b);
      t += 2;
    }
    byte[] out = new byte[bytes.size()];
    for (int i = 0; i < bytes.size(); ++i) {
      out[i] = bytes.get(i);
    }
    return out;
  }
  return new byte[] {};
}

然后你可以像这样使用它

new String(decode("51d37bdd871c9e1f4d5541be67a6ab625e"
  +"32028744d7d4609d0c37747b40cd2d"))