【问题标题】:Convert hex to original string value [duplicate]将十六进制转换为原始字符串值[重复]
【发布时间】:2016-07-24 19:57:06
【问题描述】:

在一个调用以太坊合约方法的安卓应用程序中,我有一个函数返回一个 HEX 值作为回报 (Ethereum Contract ABI),在这种情况下,字符串是 yoooooooo,而 HEX 是:

 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009796f6f6f6f6f6f6f6f0000000000000000000000000000000000000000000000

如链接中所述,合约 API 为 HEX 添加填充。如何从上面的 HEX 值中获取原始值而不进行填充?

【问题讨论】:

  • 该十六进制表示为String 还是BigInteger
  • @DebosmitRay 添加了响应数据对象的截图。 String 好像。
  • @3kings 我不知道 OP 是否检查过。但是那篇文章使用标准库确实没有什么好处(guava 解决方案很酷)。
  • @JohnYounan 嘿。我正在尝试为我在大学的学习开发一个以太坊钱包应用程序。你能告诉我,你是如何工作的吗?我没有找到任何适用于 android 的轻客户端。请提供任何指示。

标签: java android ethereum


【解决方案1】:

请试试这个

String hex = "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009796f6f6f6f6f6f6f6f0000000000000000000000000000000000000000000000";
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.toString().trim());

【讨论】:

  • 试过了,它给了�������������������������������������������������������������� �������������������������������������������������������������� yoooooooo����������������������������������������������。可以只得到字符串吗?
  • 请查看答案编辑
【解决方案2】:

试试这个。

public static String convertHexToStringValue(String hex) {
    StringBuilder stringbuilder = new StringBuilder();
    char[] hexData = hex.toCharArray();
    for (int count = 0; count < hexData.length - 1; count += 2) {
        int firstDigit = Character.digit(hexData[count], 16);
        int lastDigit = Character.digit(hexData[count + 1], 16);
        int decimal = firstDigit * 16 + lastDigit;
        stringbuilder.append((char)decimal);
    }
    return stringbuilder.toString();
}

【讨论】:

    【解决方案3】:

    (我认为)有多种方法可以解决这个问题。我将在这里列出一种处理此类问题的直观方法。

    您可以从String (hex) 转到byte array 再到String as UTF-8(?)确保你的十六进制字符串没有前导空格和东西

    public static byte[] hexStringToByteArray(String hex) {
        int l = hex.length();
        byte[] data = new byte[l/2];
        for (int i = 0; i < l; i += 2) {
            data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                                 + Character.digit(hex.charAt(i+1), 16));
        }
        return data;
    }
    

    用法:

    String b = "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009796f6f6f6f6f6f6f6f0000000000000000000000000000000000000000000000";
    byte[] bytes = hexStringToByteArray(b);
    String st = new String(bytes,StandardCharsets.UTF_8);
    System.out.println(st);
    

    给予:

    ? yoooooooo

    【讨论】:

    • 我需要找到一种方法来修复领先的?。当我这样做时,我会更新。如果你先找到路,请告诉我。
    • 我会保持打开状态,直到只有字符串值有答案,但感谢您的帮助@Debosmit Ray
    • @JohnYounan 我认为这与返回数据中的填充有关。你知道你调用了什么函数,this link 应该能够告诉你如何解析十六进制数据。根据您的帖子,? 应该在那里,因为在字符串的初始部分存在0x2。因此,您需要提供有关如何读取数据的更多信息,因为很明显,这个字符串中有一堆偏移量。
    • @DebosmitRay 请您建议领先的“?”你找到解决办法了吗??
    猜你喜欢
    • 2021-06-24
    • 2018-01-22
    • 2019-02-05
    • 2018-07-03
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2012-02-03
    • 2011-05-15
    相关资源
    最近更新 更多