Solidez convertir cadena hexadecimal a bytes

Intento convertir una cadena hexadecimal a bytes.

function MyContract() public {
    string memory str = "A76A95918C39eE40d4a43CFAF19C35050E32E271";
    array1 = bytes(str);


    bytes memory  str1 = hex"A76A95918C39eE40d4a43CFAF19C35050E32E271";
    array2 = str1; 
}

En array1 solo tengo unicode de str como array1[0] - 41. En la matriz 2 tengo lo que quiero array2[0] - a7. Pero no puedo usar hexadecimal con variable.

Quiero usar argumentos de función para la conversión a bytes como:

function (string str) {
  return bytes(hex(str))
}

Pregunta: ¿Hay alguna forma de hacer la conversión en Solidity?

Muchas gracias de antemano.

Respuestas (1)

Esto es muy ineficiente pero debería funcionar.

// Convert an hexadecimal character to their value
function fromHexChar(uint8 c) public pure returns (uint8) {
    if (bytes1(c) >= bytes1('0') && bytes1(c) <= bytes1('9')) {
        return c - uint8(bytes1('0'));
    }
    if (bytes1(c) >= bytes1('a') && bytes1(c) <= bytes1('f')) {
        return 10 + c - uint8(bytes1('a'));
    }
    if (bytes1(c) >= bytes1('A') && bytes1(c) <= bytes1('F')) {
        return 10 + c - uint8(bytes1('A'));
    }
    revert("fail");
}

// Convert an hexadecimal string to raw bytes
function fromHex(string memory s) public pure returns (bytes memory) {
    bytes memory ss = bytes(s);
    require(ss.length%2 == 0); // length must be even
    bytes memory r = new bytes(ss.length/2);
    for (uint i=0; i<ss.length/2; ++i) {
        r[i] = bytes1(fromHexChar(uint8(ss[2*i])) * 16 +
                    fromHexChar(uint8(ss[2*i+1])));
    }
    return r;
}

En cualquier caso, recomendaría intentar convertir sus datos hexadecimales fuera de la solidez.

Gracias por la respuesta, la parte inferior es lo que necesito, pero devuelve bytes. Esta puede ser una pregunta estúpida, pero ¿cómo lo obtengo como bytes32?
@thefett Debería ser posible, declarar bytes32 ren lugar de bytes memory r = new bytes(..). El problema es que no es fácil modificar bytes individuales de bytes32, pero puede lograrlo con la conversión a uint y el uso de turnos.
esto no funciona lamentablemente...
@Jim Lo intenté y las funciones funcionaron desde solc 0.5. Tenía una advertencia con solc 0.8 pero era fácil de arreglar, debería haber funcionado de todos modos.
cuando llamo fromHex("FF") quiero que devuelva la unidad 255, no los bytes sin procesar. ¿No es esto lo que OP está preguntando?
@Jim La pregunta pide devolver una matriz de bytes para que funcione según lo previsto. No debería ser demasiado difícil de modificar para devolver un uint256 en su lugar. En cualquier caso será mejor crear una nueva pregunta, o mejor buscar si ya existe.
Por favor, hazlo por mí, fran.
@Jim Lo siento, pero estoy ocupado, así que no.
No hay prisa, te espero. ¡Gracias! 👍