Cómo convertir bytes a uint en Solidity

Oye, ¿hay alguna manera de convertir bytesa uintSolidity?

¿Podría explicar qué conversión le gustaría? Mejor si puede dar un ejemplo de un bytesvalor y el uintvalor correspondiente que le gustaría ver.

Respuestas (4)

Puede usar esta función para convertir bytesa 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 bytesvariable, pero esto es barato. Convertir una bytesvariable de longitud 20 usa aproximadamente 420 de gas.

Espero que esto ayude

Obteniendo un error en Remix: TypeError: la memoria de bytes de tipo de argumento devuelto no se puede convertir implícitamente al tipo esperado uint256
¿Puedes mostrarme tu código?, esto me funciona bien en remix, puse el código completo para que puedas copiarlo y pegarlo. Hágamelo saber
Oh, ahí tienes. Creo que tu primera publicación tuvo el valor de retorno como "b". Esto funciona. ¡Gracias!

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;
}
Solución de eficiencia de gas aquí

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.

¡¡¡¡lindo lindo lindo!!!!

Si conoce la longitud de bytes (por ejemplo, la dirección tiene 20 bytes), puede convertir mediante conversión

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

¿Algún riesgo por esto?
No veo ningún riesgo. uint160 tiene una longitud de 20 bytes. Y uint256 se ajusta a uint160.