So konvertieren Sie Bytes in Solidity in uint

Hey, gibt es eine Möglichkeit, in Solidity zu byteskonvertieren uint?

Können Sie erklären, welche Konvertierung Sie möchten? Am besten, wenn Sie ein Beispiel für einen bytesWert und den entsprechenden uintWert angeben können, den Sie sehen möchten.

Antworten (4)

Sie können diese Funktion verwenden, um zu konvertieren bytesin uint:

pragma solidity ^0.4.23;

contract mycontract {

    function bytesToUint(bytes b) public returns (uint256){
        uint256 number;
        for(uint i=0;i<b.length;i++){
            number = number + uint(b[i])*(2**(8*(b.length-(i+1))));
        }
        return number;
    }
}

Aktualisierte Funktion fürsolidity ^0.8.11

function bytesToUint(bytes memory b) internal pure returns (uint256){
        uint256 number;
        for(uint i=0;i<b.length;i++){
            number = number + uint(uint8(b[i]))*(2**(8*(b.length-(i+1))));
        }
    return number;
}

Die verwendete Gasmenge hängt von der Länge Ihrer bytesVariable ab, aber das ist billig. Die Umwandlung einer bytesVariablen der Länge 20 verbraucht etwa 420 Gas.

Hoffe das hilft

Erhalten eines Fehlers in Remix: TypeError: Rückgabeargumenttyp Bytes Speicher ist nicht implizit in den erwarteten Typ uint256 konvertierbar
Können Sie mir Ihren Code zeigen? Das funktioniert für mich gut im Remix, ich habe den gesamten Code so eingefügt, dass Sie ihn einfach kopieren und einfügen können. Gib mir Bescheid
Oh, da gehst du. Ich denke, Ihr erster Beitrag hatte den Rückgabewert als "b". Das funktioniert. Vielen Dank!

Ein uint mithilfe von Inline-Assemblierung aus Bytes schneiden

function sliceUint(bytes bs, uint start)
    internal pure
    returns (uint)
{
    require(bs.length >= start + 32, "slicing out of range");
    uint x;
    assembly {
        x := mload(add(bs, add(0x20, start)))
    }
    return x;
}
Gaseffiziente Lösung hier

Eine voll funktionsfähige moderne Lösung finden Sie in diesem von ConsenSys verfassten Repository :

function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
    require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
    uint256 tempUint;

    assembly {
        tempUint := mload(add(add(_bytes, 0x20), _start))
    }

    return tempUint;
}

Die akzeptierte Antwort funktioniert in Solidity ^ 0.5 nicht mehr; es erzeugt einen Typkonvertierungsfehler.

gut gut gut!!!!

Wenn Sie die Bytelänge kennen (z. B. Adresse hat 20 Bytes), können Sie sie durch Casting konvertieren

uint256 time = uint160(bytes20(0x2E4e72EDC83053F8ADE4a525191Ba7aBA086c067));

Gibt es dafür ein Risiko?
Ich sehe kein Risiko. uint160 ist 20 Bytes lang. Und uint256 passt zu uint160.