Hey, gibt es eine Möglichkeit, in Solidity zu bytes
konvertieren uint
?
Sie können diese Funktion verwenden, um zu konvertieren bytes
in 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 bytes
Variable ab, aber das ist billig. Die Umwandlung einer bytes
Variablen der Länge 20 verbraucht etwa 420 Gas.
Hoffe das hilft
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;
}
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.
Wenn Sie die Bytelänge kennen (z. B. Adresse hat 20 Bytes), können Sie sie durch Casting konvertieren
uint256 time = uint160(bytes20(0x2E4e72EDC83053F8ADE4a525191Ba7aBA086c067));
Benutzer19510
bytes
Wert und den entsprechendenuint
Wert angeben können, den Sie sehen möchten.