Rust 将u32数组中存储的大量数据转换为字节并返回
我正在做一些关于Rust的计算数学,我有一些大的数字,我把它们存储在一个由24个值组成的数组中。我有一些函数可以将它们转换为字节或返回字节,但它对Rust 将u32数组中存储的大量数据转换为字节并返回,rust,Rust,我正在做一些关于Rust的计算数学,我有一些大的数字,我把它们存储在一个由24个值组成的数组中。我有一些函数可以将它们转换为字节或返回字节,但它对u32值不起作用,而对u64则起作用。下面是代码示例: fn main() { let mut bytes = [0u8; 96]; // since u32 is 4 bytes in my system, 4*24 = 96 let mut j; let mut k: u32; let mut num: [u32;
u32
值不起作用,而对u64
则起作用。下面是代码示例:
fn main() {
let mut bytes = [0u8; 96]; // since u32 is 4 bytes in my system, 4*24 = 96
let mut j;
let mut k: u32;
let mut num: [u32; 24] = [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);
for i in 0..96 {
j = i / 4;
k = (i % 4) as u32;
bytes[i as usize] = (num[j as usize] >> (4 * k)) as u8;
}
println!("num_to_ytes: {:?}", &bytes[..]);
num = [0u32; 24];
for i in 0..96 {
j = i / 4;
k = (i % 4) as u32;
num[j as usize] |= (bytes[i as usize] as u32) << (4 * k);
}
println!("recovered_num: {:?}", num);
}
fn main(){
让mut bytes=[0u8;96];//因为在我的系统中,u32是4个字节,所以4*24=96
让mut j;
设mutk:u32;
让mut num:[u32;24]=[1335565270420381354920205583,28393654494,2315860270,442833049,1854500981,2254414916,4192631541,207282666112,1479410393,718887683,1421359821,7339433,4073545728,41847475560,1761299410,3068851576,1582484065,1882676300,15657029,415067470747,1883946895,4146];
println!(“原始数量:{:?}”,num);
因为我在0..96{
j=i/4;
k=(i%4)作为u32;
字节[i as usize]=(num[j as usize]>>(4*k))作为u8;
}
println!(&bytes[…]);
num=[0u32;24];
因为我在0..96{
j=i/4;
k=(i%4)作为u32;
num[j as usize]|=(bytes[i as usize]as u32)学习如何创建数组是编程时的一项关键技能。例如,为什么要有数组?为什么要重用变量
原始的第一个数字是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位的倍数移位:
0/0
1/4
2/8
3/12
我非常确定,现在每个通用平台都使用8位表示一个字节,而不是4
这就是为什么幻数是不好的。如果你用常量作为值,你会很快发现这个问题
因为u32在我的系统中是4个字节
一个u32
更好在每个系统上有4个字节-这就是为什么它是一个u32
总的来说,不要重新发明轮子。使用byteorder板条箱或同等设备:
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);
}
extern板条箱字节顺序;
使用字节顺序:{BigEndian,readbyteext,writebytextest};
常数长度:usize=24;
const BYTES_PER_U32:usize=4;
fn main(){
let num:[u32;长度]=[
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!(“原始数量:{:?}”,num);
让mut bytes=[0u8;长度*字节/U32];
{
让mut bytes=&mut bytes[…];
用于编号中的编号(&n){
字节。write_u32::(n.unwrap();
}
}
让mut num=[0u32;长度];
{
让mut字节=&字节[…];
对于n in和mut num{
*n=字节。读取32::()。展开();
}
}
println!(“恢复的_num:{:?}”,num);
}
谢谢。事实上,我被这些神奇的数字咬了一口,没有意识到移位量。实际上,我不确定u32
在每个系统上必须是4字节。在C中,uint32\u t
不一定在所有平台上都可用,因为有些平台没有8位字节(即CHAR\u BIT!=8
)@MatthieuM.我一直觉得Rust的u32
总是正好是32位。即使在Arduino上(8位寄存器大小),i128
以较小寄存器的分组形式存在。@MatthieuM.我知道有这样的平台,C可能会也可能不会处理它们,但Rust是否真的试图对这些类型的平台中的任何一种工作?@Shepmaster:Rust所有的平台!。