2016-04-05 9 views
0

In einem Android App Astraleum Vertrag Methode aufrufen, ich habe eine Funktion, die mir einen HEX-Wert im Gegenzug zurückgibt (Ethereum Contract ABI), in diesem Fall die Zeichenfolge yoooooooo und HEX ist:Convert Hex ursprünglichen String-Wert

0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009796f6f6f6f6f6f6f6f0000000000000000000000000000000000000000000000 

enter image description here

Die Kontrakt-API fügt dem HEX wie in der Verknüpfung erläutert Auffüllen hinzu. Wie bekomme ich den ursprünglichen Wert von HEX-Wert oben ohne Polsterung?

+0

ist, dass hex dargestellt als 'String' oder' BigInteger'? –

+0

@DebosmitRay hat einen Screenshot des Antwortdatenobjekts hinzugefügt. 'String' scheint es. – ke3pup

+0

@ 3kings Ich weiß nicht, ob OP das überprüft hat. Aber diese Post hat wirklich nichts Gutes mit Standard-Bibliotheken ('Guava' Lösung ist cool). –

Antwort

1

Bitte versuchen Sie dieses

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

versuchte es, es gibt ' \t yoooooooo '. möglich, nur die Saite zu bekommen? – ke3pup

+0

Bitte schauen Sie in die Antwort bearbeiten –

2

versuchen diese.

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

(glaube ich) gibt es mehrere Möglichkeiten, dies zu erreichen. Ich werde hier eine intuitive Art aufzeigen, wie man sich einem Problem wie diesem nähert. Sie können von String (hex) zu byte array zu String as UTF-8(?) gehen. Stellen Sie sicher, dass Ihre Hex-Zeichenfolge keine führenden Leerzeichen und Zeug hat.

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; 
} 

Verbrauch:

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

Gibt:

? yoooooooo

+0

Ich muss einen Weg finden, um diese führende '?' Zu beheben. Ich werde aktualisieren, wenn ich es tue. Wenn Sie zuerst den Weg finden, lassen Sie es mich bitte wissen. –

+0

Ich werde es offen halten, bis es eine Antwort gibt mit nur dem String-Wert, aber danke für Ihre Hilfe @Debosmit Ray – ke3pup

+0

@JohnYounan Ich denke, es ist etwas mit Padding in den zurückgegebenen Daten zu tun. Sie wissen, welche Funktion Sie aufgerufen haben, und [dieser Link] (https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#use-of-dynamic-types) sollte Ihnen sagen können, wie Sie vorgehen sollen parse die Hex-Daten. Basierend auf deinem Post sollte das '?' ** da sein, weil im ersten Teil der Zeichenfolge '0x2' vorhanden ist. Sie müssten also entweder mehr Informationen darüber bereitstellen, wie die Daten gelesen werden sollen, denn es gibt eindeutig eine Menge Offset in dieser Zeichenfolge. –