按位运算,将u32与字节数组进行比较

问题描述 投票:1回答:1

假设我将值1025作为字节数组并将值1030作为usize。如果不对数组进行反序列化,该如何比较字节数组是更大,或更小还是相等?

我完全被困住了,我认为最简便的方法是获取字节数组的最大字节及其位置,然后对u32进行位移位,看看是否设置了字节中的任何位(如果不是,则字节数组更大)。

总之,我想编写一些函数来决定a> b,a

使用代码示例

fn is_greater(a: &[u8], b: usize) -> bool {
    // a is LE, so reverse and get the largest bytes
    let c = a.iter()
        .enumerate()
        .rev()
        .filter_map(|(i, b)| ( if *b != 0 { return Some((i, *b)); } else { None }))
        .collect::<Vec<(usize, u8)>>();

    for (i, be) in c {
        let k = (b >> (i * 8)) & 255;
        println!("{}, {}", be, k);

        return be as usize > k
    }

    false
}

编辑:应该澄清,字节数组可以是任何整数,无符号整数或浮点数。简单地,任何整数bincode :: serialize都可以序列化。

我还牢记要避免转换字节数组,应该在100000个字节数组上使用比较,因此我认为位操作是首选方法。

rust comparison bit-manipulation byte bitwise-operators
1个回答
0
投票

不需要所有这些额外的步骤。基本问题是要知道在字节数组中编码的整数是little endianbig endian还是native endian。知道这一点,您可以使用usize::from_??_bytes将固定大小的数组转换为整数。使用usize::from_??_bytes从切片中获取固定大小的数组。

TryFrom-trait

如果字节片小于8个字节,此函数将返回错误,在这种情况下,无法构造TryFrom;您还可以转换为fn is_greater(b: &[u8], v: usize) -> Result<bool, std::array::TryFromSliceError> { use std::convert::TryFrom; Ok(usize::from_le_bytes(<[u8; 8]>::try_from(b)?) > v) } 甚至usize,将其转换为u32,然后进行比较。另请注意,假设字节切片包含编码为u16的整数,则此示例使用usize

© www.soinside.com 2019 - 2024. All rights reserved.