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

2023-12-22

我正在用 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);
}

上面的代码没有从字节数组中检索正确的数字。但是,如果我改变一切u32 to u64, all 4s to 8s,并减小num从 24 个值到 12 个值,一切正常。我认为我有一些逻辑问题u32版本。正确工作的u64版本可以在.


学习如何创建一个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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 u32 数组中存储的大数转换为字节并返回 的相关文章

随机推荐

  • 从IP地址获取子网掩码和网关

    我该如何计算subnet mask and gateway从一个IP address 假设我的 IP 地址是180 12 24 68 那么如何计算这个IP的子网掩码和网关呢 您无法计算您的子网掩码or仅来自 IP 地址的网关 您可以在给定
  • 在网络服务器上管理多个.Net框架

    因此 我负责在生产服务器上部署我的项目 其中还设置了一些其他 ASP NET 网站 现在的问题是 我在 NET 3 5 下编写了整个项目 但在网络服务器上当前安装是 NET 1 1 因为其他一些项目需要它们 不要问我为什么 我也无法弄清楚
  • 将列表列表拆入 pandas 数据框[重复]

    这个问题在这里已经有答案了 假设我有以下数据框 x pd DataFrame a x y x t x r y t b 1 0 1 a b 0 x y 1 1 x t x r 0 2 y t 1 我想去 letter num 0 x 1 1
  • Python 中的 __del__() 方法有什么用?

    From Python 文档 https docs python org 3 reference datamodel html highlight del object del 不保证 del 为解释器退出时仍然存在的对象调用方法 据我了解
  • 如何连接两个节点集以尊重顺序?

    我的理解是 尽管 XSLT 的 节点集 被称为 集 但它们实际上是节点的有序列表 这就是每个节点与索引关联的原因 因此我一直在尝试使用 运算符连接节点集 以便尊重节点的顺序 我试图完成的任务类似于以下 JavaScript 代码 o1 o2
  • PowerShell - 列出我系统上的所有 SQL 实例?

    是否有 Powershell 命令可以列出我的系统上的所有 SQL 实例 微软 SQL 2008 只是另一种方法 可以比 SQLPS 更快一点来获得快速答案 get itemproperty HKLM SOFTWARE Microsoft
  • luxon 将本地时间转换为给定时区的 utc

    数据源具有没有偏移量的 ISO 8601 日期时间字段 例子 2019 07 09T18 45 然而 我知道所讨论的时间被理解为America Chicago时区 如何获得与 UTC 时间相当的 Luxon DateTime 对象 我可以D
  • 在驼峰式标记上的单词之间插入空格[重复]

    这个问题在这里已经有答案了 有没有一个很好的功能可以将类似的东西变成 名 to this 名 See NET 如何将 caps 分隔字符串拆分为数组 https stackoverflow com questions 155303 net
  • 如何在 SQL Server 中查找未使用的表

    有没有办法找出数据上次输入表的时间 我正在尝试在数据库中查找过时的表 并想知道是否有可以运行的简单脚本 您可以尝试检查查询结果sys dm db index usage stats http msdn microsoft com en us
  • 解压嵌套字典的更简洁的方法

    我正在从 API 批量接收 JSON 格式的数据 我希望仅将值存储在列表中 原始数据看起来像这样并且总是看起来像这样 即 所有 看起来像第一个示例 data content get data gt gt gt a 1 b c 2 d 3 e
  • DropzoneJS dataURL 未定义

    我正在制作一个上传脚本 但我一直在 addedfile 事件中从 file 获取 dataURL 这是我的代码 function var dropzone new Dropzone avatar url uploads avatar cli
  • Visual Studio 显示无尽的消息“属性‘valueMember’的代码生成失败。”

    使用 Visual Studio 2008 愉快地开发这个 C 应用程序几天后 我被一系列显示的错误对话框震惊了 属性的代码生成 价值会员 失败的 错误是 你调用的对象是空的 当我对设计器进行微小更改时 例如 现在经常会发生这种情况 将控件
  • 派生类的抽象基类,其函数具有派生类的返回类型

    我想对从基类派生的所有类强制使用特定的 API 通常 您可以使用具有纯虚函数的抽象基类来执行此操作 但是 如何处理返回派生类型的函数 我该如何强制执行这种类型的功能 struct base virtual base func 0 struc
  • 32 位 Linux 上的 PyInstaller - ImportError:需要“六个”包

    我正在使用一个程序Python2 7 and Kivy1 9 2 dev 并尝试将其打包PyInstaller 3 0对于不同的系统作为单个可执行文件 我尝试将其打包的系统是 64 位 Linux Mint 17 3 32位Linux Mi
  • WPF——它一定比我做的更容易

    我正在花最长时间来解决这个问题 假设我有两个按钮和三个文本块 我希望任一按钮都能触发所有 TextBlock 上的简单情节提要 目前 我正在尝试定义一个包含故事板的通用文本块样式 然后触发器来自任何按钮单击 这是我最接近的一次 但应用程序在
  • 编译器在多线程程序中使用寄存器

    这是一个普遍问题 但是 在多线程程序中 编译器使用寄存器临时存储全局变量是否安全 我认为不是 因为在寄存器中存储全局变量可能会更改保存的值 对于其他线程 那么使用寄存器来存储函数中定义的局部变量怎么样 我认为这是可以的 因为没有其他线程能够
  • Python 程序的跟踪表

    有没有办法获取Python程序的跟踪表 或者让一个程序运行另一个程序并获取其跟踪表 我是一名老师 试图完美地验证我们在测试中使用的追踪问题的答案 例如 假设我有一个名为的 Python 程序problem1 py包含以下内容 问题1 py
  • 高效保存加权移动平均线的数据结构/算法

    我想在存储日志记录时总结多个不同类别的移动平均值 想象一下 有一项服务一次保存一个 Web 服务器日志条目 让我们进一步想象一下 我们无权访问记录的记录 所以我们只能看到它们一次 但之后就无法再访问它们了 对于不同的页面 我想知道 点击总数
  • 使用 git 和 MAMP 进行本地开发的权限

    我正在一个干净的帐户上设置一台新机器 我正在 Mac OSX 10 8 2 上使用 MAMP Pro 进行本地开发 并使用 git 进行版本控制 我遇到权限问题 MAMP Pro allows you to set permission t
  • 将 u32 数组中存储的大数转换为字节并返回

    我正在用 Rust 做一些计算数学 我有一些大数字 我将它们存储在一个包含 24 个值的数组中 我有将它们转换为字节并返回的函数 但它不能正常工作u32值 而它适用于u64 代码示例如下 fn main let mut bytes 0u8