2016-04-05 3 views
0

В андроида приложения вызывающего метода контракта Эфириума, у меня есть функция, которая возвращает меня значение HEX взамен (Ethereum Contract ABI), в этом случае строка yoooooooo и HEX является:Преобразовать шестнадцатеричный к исходному значению строки

0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009796f6f6f6f6f6f6f6f0000000000000000000000000000000000000000000000 

enter image description here

Контракт API добавляет дополнение к HEX, как поясняется в ссылке. как получить исходное значение из значения HEX выше без заполнения?

+0

является то, что гекс представлен в виде 'String' или' BigInteger'? –

+0

@DebosmitRay добавил скриншот объекта данных ответа. Кажется, что «Строка». – ke3pup

+0

@ 3kings Я не знаю, проверил ли OP это. Но этот пост действительно не имеет ничего хорошего, используя стандартные библиотеки ('guava' - это круто). –

ответ

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()); 
+0

попробовал, он дает ' \t yoooooooo '. можно получить только строку? – ke3pup

+0

Пожалуйста, зайдите в ответ edit –

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(); 
} 
0

(я думаю) есть несколько возможных способов приближения к этому. Я приведу здесь интуитивный способ приблизиться к такой проблеме.

Вы можете перейти от 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

+0

Мне нужно будет найти способ исправить этот ведущий '?'. Когда я это сделаю, я обновлю. Если вы сначала найдете путь, пожалуйста, дайте мне знать. –

+0

Я буду держать его открытым, пока есть ответ только с строковым значением, но спасибо за вашу помощь @Debosmit Ray – ke3pup

+0

@JohnYounan Я думаю, что это что-то связано с заполнением возвращаемых данных. Вы знаете, какую функцию вы вызвали, и [эта ссылка] (https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#use-of-dynamic-types) должна быть в состоянии рассказать вам, как проанализировать шестнадцатеричные данные. Основываясь на вашем сообщении, '?' ** должен быть ** из-за наличия '0x2' в начальной части строки. Таким образом, вам нужно будет либо предоставить дополнительную информацию о том, как данные должны быть прочитаны, потому что, очевидно, в этой строке есть куча смещения. –