Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to imply a specific number of bytes to a string slice

Might seem like a dumb question, however, I’ve been trying to restrict a string slice (that comes as parameter to a function) to a number of bytes.

This is what I’ve tried

fn padd_address(addr: &str) -> Result<web3::types::H256, std::error::Error> {
  if addr.strip_prefix("0x").unwrap().as_bytes().len() > std::mem::size_of::<[u8; 20]>() {
    std::error::Error()
  }

  let padded = &format!("0x{}", format!("{:0>64}", addr))[..];
  H256::from_str(padded).unwrap()
}

Now assume I have an address like this
let addr = "0xdAC17F958D2ee523a2206206994597C13D831ec7";. The function will firstly, strip 0x prefix and after will compute the nb of bytes associated with the string.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Now if I were to println!("{:?}", addr.strip_prefix("0x").unwrap().as_bytes().len()) I get 40 bytes in return instead of 20 which is the actual size of a contract address.

Any thoughts how I can check whether the string that comes as parameter, i.e addr has 20 bytes only?

>Solution :

I get 40 bytes in return instead of 20 which is the actual size of a contract address.

No, your address is

dAC17F958D2ee523a2206206994597C13D831ec7

which is in fact 40 bytes. as_bytes() simply returns the bytes data underlying the string, so it returns

b"dAC17F958D2ee523a2206206994597C13D831ec7"

it does not decode anything. Which incidentally makes it useless syntactic overhead as it’s literally what str::len does.

If you want the underlying value, you need something like the hex crate to decode your address from hexadecimal to binary (or hand-roll the same decoding), at which point you will have 20 bytes of data.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading