Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn float(data: &[u8]) -> IResult<&[u8], f32> {
- let mut pos = 0;
- let mut next_nibble = || -> u8 {
- let nibble = (data[pos/2] >> (4 * (pos & 1) as u8)) & 0xf;
- pos += 1;
- nibble
- };
- let mut is_negaive = false;
- let mut digits = vec![];
- let mut power_digits = vec![];
- let mut power_negative = false;
- let mut decimal_point = None;
- loop {
- match next_nibble() {
- d @ 0 ..= 9 => digits.push(b'0' + d),
- 0xa => decimal_point = Some(digits.len()),
- b @ 0xb | 0xc => { // positive 10^x
- power_negative = (b == 0xc);
- loop {
- match next_nibble() {
- d @ 0 ..= 9 => power_digits.push(b'0' + d),
- 0xf => break
- }
- }
- },
- 0xd => panic!("reserved"),
- 0xe => is_negaive = true,
- 0xf => break,
- _ => unreachable!()
- }
- }
- let mut n = i32::parse(&digits);
- if is_negaive {
- n *= -1;
- }
- let mut value = n as f32;
- let mut power = 0;
- if let Some(dp) = decimal_point {
- power += dp - digits.len();
- }
- if power_digits.len() > 0 {
- let mut p = i32::parse(&power_digits);
- if power_negative {
- p *= -1;
- }
- power += p;
- }
- if power != 0 {
- value *= 10.0.powi(power);
- }
- Ok((&data[(pos+1)/2 ..], value))
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement