Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. fn float(data: &[u8]) -> IResult<&[u8], f32> {
  2. let mut pos = 0;
  3. let mut next_nibble = || -> u8 {
  4. let nibble = (data[pos/2] >> (4 * (pos & 1) as u8)) & 0xf;
  5. pos += 1;
  6. nibble
  7. };
  8.  
  9. let mut is_negaive = false;
  10. let mut digits = vec![];
  11. let mut power_digits = vec![];
  12. let mut power_negative = false;
  13. let mut decimal_point = None;
  14. loop {
  15. match next_nibble() {
  16. d @ 0 ..= 9 => digits.push(b'0' + d),
  17. 0xa => decimal_point = Some(digits.len()),
  18. b @ 0xb | 0xc => { // positive 10^x
  19. power_negative = (b == 0xc);
  20. loop {
  21. match next_nibble() {
  22. d @ 0 ..= 9 => power_digits.push(b'0' + d),
  23. 0xf => break
  24. }
  25. }
  26. },
  27. 0xd => panic!("reserved"),
  28. 0xe => is_negaive = true,
  29. 0xf => break,
  30. _ => unreachable!()
  31. }
  32. }
  33.  
  34. let mut n = i32::parse(&digits);
  35. if is_negaive {
  36. n *= -1;
  37. }
  38. let mut value = n as f32;
  39. let mut power = 0;
  40. if let Some(dp) = decimal_point {
  41. power += dp - digits.len();
  42. }
  43. if power_digits.len() > 0 {
  44. let mut p = i32::parse(&power_digits);
  45. if power_negative {
  46. p *= -1;
  47. }
  48. power += p;
  49. }
  50. if power != 0 {
  51. value *= 10.0.powi(power);
  52. }
  53. Ok((&data[(pos+1)/2 ..], value))
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement