rust 如何转换[u8; 32]类型为二进制

vsdwdz23  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(213)

我使用了一个Sha 256散列函数,它返回[u8; 32],因为256位长的哈希太大,无法用Rust的本机类型表示。
这些都很好,但是我需要从哈希生成一个二进制数,并检查二进制数中有多少个前导零。
有什么好办法吗?
到目前为止,我试图将每个单独的u8转换为它的二进制形式,并将它们连接在一起,但这并不能生成正确的数字。

pub fn to_bits(arr: &[u8; 32]) -> String {
    let mut final_str = String::new();
    for i in arr {
        final_str.push_str(&format!("{:b}", i));
    }

    final_str
}
2ledvvac

2ledvvac1#

实际上,你不需要把它转换成另一种形式就可以做到这一点。每个字节都可以用u8::leading_zeros来检查它的前导零位,所以你可以写这样的东西(包括测试):

pub fn leading_bits(arr: &[u8; 32]) -> u32 {
    let mut count = 0;
    for x in arr {
        let bits = x.leading_zeros();
        count += bits;
        if bits != 8 {
            break;
        }
    }
    count
}

#[cfg(test)]
mod tests {
    use super::leading_bits;

    #[test]
    fn test_leading_bits() {
        assert_eq!(leading_bits(&[0u8; 32]), 256);
        assert_eq!(leading_bits(&[1u8; 32]), 7);
        let mut buf = [0u8; 32];
        buf[1] = 0x80;
        assert_eq!(leading_bits(&buf), 8);
        buf[1] = 0x00;
        buf[2] = 0x0f;
        assert_eq!(leading_bits(&buf), 20);
    }
}

我们依次查看每个字节,如果一个字节的前导零少于8个,那么我们至少看到了一个1,所以跳出循环。

相关问题