Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 将u32数组中存储的大量数据转换为字节并返回_Rust - Fatal编程技术网

Rust 将u32数组中存储的大量数据转换为字节并返回

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;

我正在做一些关于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; 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所有的平台!。