Solidity konvertiert Hex-String in Bytes

Ich versuche, Hex-String in Bytes umzuwandeln.

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


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

In array1 habe ich nur Unicode von str like array1[0] - 41. In Array 2 habe ich, was ich will array2[0] - a7. Aber ich kann Hex nicht mit Variablen verwenden.

Ich möchte Funktionsargumente für die Konvertierung in Bytes verwenden wie:

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

Frage: Gibt es eine Möglichkeit, die Konvertierung in Solidity durchzuführen?

Vielen Dank im Voraus.

Antworten (1)

Dies ist sehr ineffizient, sollte aber funktionieren

// 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 jedem Fall würde ich empfehlen, zu versuchen, Ihre hexadezimalen Daten außerhalb der Solidität zu konvertieren.

Danke für die Antwort, das Ende ist das, was ich brauche, aber es gibt Bytes zurück. Das mag eine dumme Frage sein, aber wie bekomme ich es als bytes32?
@thefett Es sollte möglich sein, bytes32 rstatt bytes memory r = new bytes(..). Das Problem ist, dass es nicht einfach ist, einzelne Bytes von bytes32 zu ändern, aber das Umwandeln in uint und die Verwendung von Verschiebungen können Sie erreichen.
das geht leider nicht...
@Jim Ich habe es versucht und die Funktionen funktionierten ab Solc 0.5. Es hatte eine Warnung mit Solc 0.8, aber es war einfach zu beheben, es hätte trotzdem funktionieren sollen.
Wenn ich fromHex ("FF") aufrufe, möchte ich, dass die Einheit 255 zurückgegeben wird, nicht die Rohbytes. Ist das nicht das, was OP fragt?
@Jim Die Frage fragt nach der Rückgabe eines Byte-Arrays, damit es wie beabsichtigt funktioniert. Es sollte nicht zu schwer sein, es zu ändern, um stattdessen ein uint256 zurückzugeben. In jedem Fall ist es besser, eine neue Frage zu erstellen oder besser zu suchen, wenn es eine bestehende gibt.
Kannst du es bitte für mich tun, Fran
@ Jim Tut mir leid, aber ich bin beschäftigt, also nein.
Keine Eile, ich warte auf dich. Danke! 👍