学习如何创建一个MCVE /help/mcve是编程时的一项关键技能。例如,为什么要有一个数组?你为什么reuse变量?
您原来的第一个号码是0x4F9B1BD6
,输出的第一个数字是0x000B1BD6
.
比较中间字节表明你有垃圾:
let num = 0x4F9B1BD6_u32;
println!("{:08X}", num);
let mut bytes = [0u8; BYTES_PER_U32];
for i in 0..bytes.len() {
let k = (i % BYTES_PER_U32) as u32;
bytes[i] = (num >> (4 * k)) as u8;
}
for b in &bytes {
print!("{:X}", b);
}
println!();
4F9B1BD6
D6BD1BB1
打印出以下值k
:
for i in 0..bytes.len() {
let k = (i % BYTES_PER_U32) as u32;
println!("{} / {}", k, 4 * k);
bytes[i] = (num >> (4 * k)) as u8;
}
表明您正在尝试按倍数进行移位4 bits:
0 / 0
1 / 4
2 / 8
3 / 12
我很确定当今每个常见平台都使用8位代表一个字节,而不是4.
This is 为什么幻数不好。如果您使用常量作为值,您会更快注意到问题。
因为 u32 在我的系统中是 4 个字节
A u32
better是 4 个字节每个系统——这就是为什么它是u32
.
总的来说,不要重新发明轮子。使用 byteorder crate 或等效项:
extern crate byteorder;
use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
const LENGTH: usize = 24;
const BYTES_PER_U32: usize = 4;
fn main() {
let num: [u32; LENGTH] = [
1335565270, 4203813549, 2020505583, 2839365494, 2315860270, 442833049, 1854500981,
2254414916, 4192631541, 2072826612, 1479410393, 718887683, 1421359821, 733943433,
4073545728, 4141847560, 1761299410, 3068851576, 1582484065, 1882676300, 1565750229,
4185060747, 1883946895, 4146,
];
println!("original_num: {:?}", num);
let mut bytes = [0u8; LENGTH * BYTES_PER_U32];
{
let mut bytes = &mut bytes[..];
for &n in &num {
bytes.write_u32::<BigEndian>(n).unwrap();
}
}
let mut num = [0u32; LENGTH];
{
let mut bytes = &bytes[..];
for n in &mut num {
*n = bytes.read_u32::<BigEndian>().unwrap();
}
}
println!("recovered_num: {:?}", num);
}