[英]converting from BigInt to BitArray
使用 rust 将 object 从 bigint (BigInt) 转换为位 (BitArray<217>) 的最佳方法也是反向的(下面的示例)
使用二进制到十进制计算器我手工验证了 bigint 和 bits 相等
let bigint = BigInt::parse_bytes("141644482300309102636663083870634002744809361056209271964506585197".as_ref(), 10);
to
let bits = BitArray::new( [1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1]);
板条箱参考。
对于 BigInt: https://crates.io/crates/num-bigint (num-bigint = "0.4.3")
对于 BitArray: https://crates.io/crates/bitarray (bitarray = "0.10.0")
几个误解:
BigInt
) 转换为编译时已知的大小 ( BitArray
)BigInt
已签名,但在转换过程中您绝不会考虑签名。 如果您想忽略签名,您可能想改用BigUint
。BitArray
仅包含1
和0
值。 然而, bitarray::BitArray
表示字节,意思是每个值都是 8 位,取值范围为0
到255
。 如果你转换它,值实际上是BitArray::new([1, 88, 81, 147, 230, 162, 120, 203, 210, 232, 153, 239, 115, 92, 222, 74, 147, 18, 216, 202, 55, 207, 181, 126, 72, 92, 248, 109])
和28
长。bitarray::BitArray
似乎无法按位迭代它,所以我不知道这个库对你有多大用处。 它强制编译时间大小的事实也与您的用例不兼容。 您可能应该选择不同的库。 “位数组”的整个概念可能不是您想要的,您可能想要一个具有运行时大小的“位向量”。 也就是说, bitarray
由packed bits组成,这意味着每个值 8 位(或更多)。 如果你想要一个纯Vec<bool>
,你不需要任何这些,你可以直接将它转换成那个:
use num_bigint::BigUint;
fn main() {
let bigint = BigUint::parse_bytes(
"141644482300309102636663083870634002744809361056209271964506585197".as_ref(),
10,
)
.unwrap();
let bits = bigint
.to_bytes_be()
.into_iter()
.flat_map(|val| {
let val = [
(val >> 7) & 1,
(val >> 6) & 1,
(val >> 5) & 1,
(val >> 4) & 1,
(val >> 3) & 1,
(val >> 2) & 1,
(val >> 1) & 1,
(val >> 0) & 1,
];
val.into_iter()
})
.collect::<Vec<_>>();
println!("{:?}", bits);
}
[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1]
并不是说您给出的值似乎是小端,而这个是大端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.