Wie konvertiert man Java-String in Bytes32 in Java? Ich verwende den Web3j Solidity Wrapper, um mit Smart Contract zu interagieren. Ich erhalte folgenden Fehler:

java.lang.UnsupportedOperationException: Das Eingabe-Byte-Array muss im Bereich 0 < M <= 32 liegen und die Länge muss mit dem Typ übereinstimmen

Ich versuche, wie unten angegeben zu tun. Ich wollte die Leute hinzufügen, aber der in web3j generierte Wrapper hat den obigen Fehler ausgelöst:

String s = "Rahul"; 
//System.out.println(s.getBytes().length);
Bytes32 b1=new Bytes32(s.getBytes());
contract.addPerson(b1,new Uint256(new BigInteger("35"));
Können Sie zur Unterstützung Ihrer Frage ein bisschen mehr Informationen hinzufügen?
Zeichenfolge s = "Rahul"; System.out.println(s.getBytes().length); Bytes32 b1=new Bytes32(s.getBytes()); System.out.println("Person hinzufügen --"+contract.addPerson(b1,new Uint256(new BigInteger("35"))));
Ich verstehe deine Frage nicht ganz. Wenn Sie jedoch mit Strings arbeiten möchten, gibt es in Solidity auch einen Datentyp "string", der in Web3J in einen "Utf8String" konvertiert wird. Hilft das?
Meine Anforderung ist, Java-String in byte32 zu konvertieren. Hier wollte ich das Byte32 als Eingabe an meinen Vertrag senden.
Rahul, hast du eine Lösung gefunden?
Nö. Noch nicht. Jeder, der weiß, dass die Web3J-API hier helfen kann.

Antworten (3)

Es ist am besten, wann immer möglich die JVM-Laufzeitbibliothek zu verwenden; Dieser Code ist normalerweise von hoher Qualität, obwohl es Ausnahmen gibt. Im folgenden Code erstelle ich zuerst einen und leite byte[]dann einen Hex-Wert ab, indem ich DatatypeConverter.printHexBinary aufrufe .

byte[] byteArray = "This string is converted to a byte array".getBytes();
String hexValue = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);
Was ist das Gegenteil dieses Codes? Ich meine die Konvertierung von Strings aus Byte32.

Ich bin mir nicht sicher, ob Sie noch eine Lösung benötigen, aber da dies noch unbeantwortet ist und für andere, die möglicherweise Bedarf haben.

str.getBytes()gibt nur ein Byte dieser Zeichenfolge zurück, aber der tatsächliche Prozess ist nur lang.

Das Hauptproblem ist, Bytes32(byte[])dass nur 32 Längen unterstützt werden byte[]. Denken Sie auch daran, Numeric.hexStringToByteArray(strValueInHex)jeden Hex-Wert von String in umzuwandeln byte[].

Dies ist der Prozess

Hinweis: "00"= 1 Länge Hex & 2 Länge String

String => Hex => 32 length Hex (ie. 64 length HexString) => byte[] => Bytes32

So habe ich String to Bytes erreicht:

String bis 64 Länge HexString:

// String to 64 length HexString (equivalent to 32 Hex lenght)
public static String asciiToHex(String asciiValue)
{
    char[] chars = asciiValue.toCharArray();
    StringBuffer hex = new StringBuffer();
    for (int i = 0; i < chars.length; i++)
    {
        hex.append(Integer.toHexString((int) chars[i]));
    }

    return hex.toString() + "".join("", Collections.nCopies(32 - (hex.length()/2), "00"));
}

HexString der Länge 64 bis Byte[] der Länge 32:

byte[] myStringInByte = Numeric.hexStringToByteArray(asciiToHex("myString"));

32 Längenbyte[] bis Bytes32:

Bytes32 myStringInBytes32 = new Bytes32(myStringInByte);
Ich habe hier eine kürzere Methode geschrieben, um dieselbe Aufgabe für meine eigene Frage zu erledigen .

byte[] byte = Numeric.hexStringToByteArray("String Value");