byte_utils.rs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. use cosmwasm_std::{
  2. CanonicalAddr,
  3. StdError,
  4. StdResult,
  5. };
  6. pub trait ByteUtils {
  7. fn get_u8(&self, index: usize) -> u8;
  8. fn get_u16(&self, index: usize) -> u16;
  9. fn get_u32(&self, index: usize) -> u32;
  10. fn get_u64(&self, index: usize) -> u64;
  11. fn get_u128_be(&self, index: usize) -> u128;
  12. /// High 128 then low 128
  13. fn get_u256(&self, index: usize) -> (u128, u128);
  14. fn get_address(&self, index: usize) -> CanonicalAddr;
  15. fn get_bytes32(&self, index: usize) -> &[u8];
  16. }
  17. impl ByteUtils for &[u8] {
  18. fn get_u8(&self, index: usize) -> u8 {
  19. self[index]
  20. }
  21. fn get_u16(&self, index: usize) -> u16 {
  22. let mut bytes: [u8; 16 / 8] = [0; 16 / 8];
  23. bytes.copy_from_slice(&self[index..index + 2]);
  24. u16::from_be_bytes(bytes)
  25. }
  26. fn get_u32(&self, index: usize) -> u32 {
  27. let mut bytes: [u8; 32 / 8] = [0; 32 / 8];
  28. bytes.copy_from_slice(&self[index..index + 4]);
  29. u32::from_be_bytes(bytes)
  30. }
  31. fn get_u64(&self, index: usize) -> u64 {
  32. let mut bytes: [u8; 64 / 8] = [0; 64 / 8];
  33. bytes.copy_from_slice(&self[index..index + 8]);
  34. u64::from_be_bytes(bytes)
  35. }
  36. fn get_u128_be(&self, index: usize) -> u128 {
  37. let mut bytes: [u8; 128 / 8] = [0; 128 / 8];
  38. bytes.copy_from_slice(&self[index..index + 128 / 8]);
  39. u128::from_be_bytes(bytes)
  40. }
  41. fn get_u256(&self, index: usize) -> (u128, u128) {
  42. (self.get_u128_be(index), self.get_u128_be(index + 128 / 8))
  43. }
  44. fn get_address(&self, index: usize) -> CanonicalAddr {
  45. // 32 bytes are reserved for addresses, but only the last 20 bytes are taken by the actual address
  46. CanonicalAddr::from(&self[index + 32 - 20..index + 32])
  47. }
  48. fn get_bytes32(&self, index: usize) -> &[u8] {
  49. &self[index..index + 32]
  50. }
  51. }
  52. pub fn extend_address_to_32(addr: &CanonicalAddr) -> Vec<u8> {
  53. let mut result: Vec<u8> = vec![0; 12];
  54. result.extend(addr.as_slice());
  55. result
  56. }
  57. pub fn extend_string_to_32(s: &String) -> StdResult<Vec<u8>> {
  58. let bytes = s.as_bytes();
  59. if bytes.len() > 32 {
  60. return Err(StdError::generic_err("string more than 32 "));
  61. }
  62. let result = vec![0; 32 - bytes.len()];
  63. Ok([bytes.to_vec(), result].concat())
  64. }
  65. pub fn get_string_from_32(v: &Vec<u8>) -> StdResult<String> {
  66. let s = String::from_utf8(v.clone())
  67. .or_else(|_| Err(StdError::generic_err("could not parse string")))?;
  68. Ok(s.chars().filter(|c| c != &'\0').collect())
  69. }