8

Hey is there a way to convert bytes to uint in Solidity?

1
  • Could you explain what conversion you would like? Best if you can give an example of a bytes value and the corresponding uint value you would like to see.
    – user19510
    Jun 14, 2018 at 14:52

3 Answers 3

7

You can use this function to convert bytes to unit:

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;
    }
}

Updated function for solidity ^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;
}

The amount of gas used depends on the length of your bytes variable, but this is cheap. Converting a bytes variable of length 20 uses about 420 gas.

Hope this helps

4
  • Getting an error in Remix: TypeError: Return argument type bytes memory is not implicitly convertible to expected type uint256
    – arete
    Jun 14, 2018 at 15:02
  • Can you show me your code?, this works for me well in remix, I put the whole code so you can just copy and paste it. Let me know
    – Jaime
    Jun 14, 2018 at 15:13
  • Oh there you go. I think your first post had the return value as "b". This works. Thanks!
    – arete
    Jun 14, 2018 at 15:25
  • Good, if this answers your question, please accept it.
    – Jaime
    Jun 14, 2018 at 15:31
4

Slicing an uint out of bytes using inline assembly

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;
}
1
  • 2
    Gas efficient solution here
    – LampShade
    Oct 29, 2020 at 19:45
3

A fully working modern solution can be found in this repository, authored by 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;
}

The accepted answer is not working in Solidity ^0.5 anymore; it produces a type conversion error.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.