Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.76 KB | None | 0 0
  1. #[inline]
  2. fn encode_into(mut value: u128, result: &mut Vec<u8>) {
  3. while value > 0 {
  4. let mut item = value % 128;
  5. value /= 128;
  6. if value > 0 {
  7. item += 128;
  8. }
  9. result.push(item as u8);
  10. }
  11. }
  12.  
  13. #[inline]
  14. fn encode(value: u128) -> Vec<u8> {
  15. let mut result = Vec::new();
  16. encode_into(value, &mut result);
  17. result
  18. }
  19.  
  20. #[inline]
  21. fn encode_many(values: &[u128]) -> Vec<u8> {
  22. let mut result = Vec::new();
  23. for i in values {
  24. encode_into(*i, &mut result);
  25. }
  26. result
  27. }
  28.  
  29. #[inline]
  30. fn decode(mut bytes: &[u8]) -> Result<(u128, &[u8]), &'static str> {
  31. let mut result = 0;
  32. let mut multipler = 1;
  33. while let Some((item, rest_bytes)) = bytes.split_first() {
  34. let item = *item as u128;
  35. if item < 128 {
  36. return Ok((result + item * multipler, rest_bytes));
  37. } else {
  38. result += (item - 128) * multipler;
  39. multipler *= 128;
  40. bytes = rest_bytes;
  41. }
  42. }
  43. Err("wrong encoding or not enough data")
  44. }
  45.  
  46. #[inline]
  47. fn decode_many(mut bytes: &[u8]) -> (Vec<u128>, &[u8]) {
  48. let mut result = Vec::new();
  49. 'decode_loop: loop {
  50. match decode(bytes) {
  51. Ok((item, new_bytes)) => {
  52. result.push(item);
  53. bytes = new_bytes;
  54. }
  55. Err(_) => {
  56. break 'decode_loop;
  57. }
  58. }
  59. }
  60. (result, bytes)
  61. }
  62.  
  63. fn main() {
  64. dbg!(encode(12));
  65. let _ = dbg!(decode(&[12]));
  66. dbg!(encode(112));
  67. let _ = dbg!(decode(&[112]));
  68. dbg!(encode(512));
  69. let _ = dbg!(decode(&[128, 4, 5]));
  70. dbg!(encode(1512));
  71. let _ = dbg!(decode(&[232, 11, 128, 4]));
  72. dbg!(encode_many(&[1512, 512, 5]));
  73. let _ = dbg!(decode_many(&[232, 11, 128, 4, 5, 130]));
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement