Oye, ¿hay alguna manera de convertir bytes
a uint
Solidity?
Puede usar esta función para convertir bytes
a 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;
}
}
Función actualizada parasolidity ^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;
}
La cantidad de gas utilizada depende de la longitud de su bytes
variable, pero esto es barato. Convertir una bytes
variable de longitud 20 usa aproximadamente 420 de gas.
Espero que esto ayude
Cortar un uint de bytes usando ensamblaje en línea
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;
}
Se puede encontrar una solución moderna completamente funcional en este repositorio , creado por ConsenSys:
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;
}
La respuesta aceptada ya no funciona en Solidity ^ 0.5; produce un error de conversión de tipo.
Si conoce la longitud de bytes (por ejemplo, la dirección tiene 20 bytes), puede convertir mediante conversión
uint256 time = uint160(bytes20(0x2E4e72EDC83053F8ADE4a525191Ba7aBA086c067));
usuario19510
bytes
valor y eluint
valor correspondiente que le gustaría ver.