[Ethereum] Solidity convert hex string to bytes

bytescontract-developmentsoliditystring

I try to convert hex string to bytes.

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


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

In array1 I have only unicode from str like array1[0] - 41. In array 2 I have what I want array2[0] - a7. But I can't use hex with variable.

I want to use function arguments for conversion to bytes like:

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

Question: Is there any way to do the conversion in Solidity?

Thanks so much in advance.

Best Answer

This are very inefficient but should work

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

In any case I'd recommend to try to convert your hexadecimal data outside solidity.

Related Topic