¿Cómo convertir Java String a Bytes32 en Java? Estoy usando el envoltorio de solidez web3j para interactuar con el contrato inteligente. Recibo el siguiente error:

java.lang.UnsupportedOperationException: la matriz de bytes de entrada debe estar en el rango 0 < M <= 32 y la longitud debe coincidir con el tipo

Estoy tratando de hacer lo que se indica a continuación. Quería agregar a las personas, pero el envoltorio generado en web3j arroja el error anterior:

String s = "Rahul"; 
//System.out.println(s.getBytes().length);
Bytes32 b1=new Bytes32(s.getBytes());
contract.addPerson(b1,new Uint256(new BigInteger("35"));
¿Puede agregar un poco más de información en apoyo de su pregunta?
Cadena s = "Raúl"; System.out.println(s.getBytes().longitud); Bytes32 b1=nuevo Bytes32(s.getBytes()); System.out.println("Añadir persona --"+contrato.addPerson(b1,new Uint256(new BigInteger("35"))));
No entiendo completamente tu pregunta. Sin embargo, si desea trabajar con cadenas, Solidity también tiene un tipo de datos "cadena" que se convierte en "Utf8String" en Web3J. ¿Eso ayuda?
Mi requisito es convertir la cadena de Java a byte32. Aquí quería enviar el byte32 como entrada a mi contrato.
Rahul, ¿encontraste una solución?
No. Aún no. Cualquiera que sepa que la API de Web3J puede ayudar aquí.

Respuestas (3)

Lo mejor es utilizar la biblioteca de tiempo de ejecución de JVM siempre que sea posible; ese código suele ser de alta calidad, aunque existen excepciones. En el siguiente código, primero creo un byte[], luego obtengo un valor hexadecimal llamando a DatatypeConverter.printHexBinary .

byte[] byteArray = "This string is converted to a byte array".getBytes();
String hexValue = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);
¿Cuál es el viceversa de este código? Me refiero a convertir una cadena de Byte32.

No estoy seguro de si aún necesita una solución, pero como esto aún no tiene respuesta y para otros que puedan necesitarla.

str.getBytes()solo devuelve el byte de esa cadena, pero el proceso real es largo.

El problema principal es que Bytes32(byte[])solo admite 32 longitudes byte[]. También tenga en cuenta Numeric.hexStringToByteArray(strValueInHex)que convierte cualquier valor hexadecimal de String a byte[].

este es el proceso

Nota: "00"= 1 hexadecimal de longitud y 2 cadenas de longitud

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

Así es como logré String to Bytes:

Cadena a 64 HexString de longitud:

// 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 de 64 longitudes a 32 bytes de longitud[]:

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

32 bytes de longitud [] a Bytes32:

Bytes32 myStringInBytes32 = new Bytes32(myStringInByte);
He escrito un método más corto para hacer la misma tarea en mi propia pregunta aquí .

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