rust - 在 Rust 中修改单个字节
问题描述
在 C 语言中,如果我想修改整数的最高有效字节,我可以通过两种不同的方式进行:
#include <stdint.h>
#include <stdio.h>
int main() {
uint32_t i1 = 0xDDDDDDDD;
printf("i1 original: 0x%X\n", i1);
uint32_t i1msb = 0xAA000000;
uint32_t i1_mask = 0x00FFFFFF;
uint32_t i1msb_mask = 0xFF000000;
i1 = (i1 & i1_mask) | (i1msb & i1msb_mask);
printf("i1 modified: 0x%X\n", i1);
uint32_t i2 = 0xDDDDDDDD;
printf("i2 original: 0x%X\n", i2);
uint32_t *i2ptr = &i2;
char *c2ptr = (char *) i2ptr;
c2ptr += 3;
*c2ptr = 0xAA;
printf("i2 modified: 0x%X\n", i2);
}
i1 original: 0xDDDDDDDD
i1 modified: 0xAADDDDDD
i2 original: 0xDDDDDDDD
i2 modified: 0xAADDDDDD
屏蔽方法在 C 和 Rust 中都有效,但我还没有找到任何方法在(安全的)Rust 中执行直接字节操作方法。虽然它有一些掩码没有的字节顺序问题,但我认为这些都可以在编译时解决以提供一个安全的跨平台接口,那么为什么在安全的 Rust 中不允许直接字节操作呢?或者,如果是,请纠正我,因为我无法找到它的功能 - 我在想类似的东西
fn change_byte(i: &u32, byte_num: usize, new_val: u8) -> Result<(), ErrorType> { ... }
它在执行操作之前检查 byte_num 是否在范围内,并且 byte_num 总是从最低有效字节到最高有效字节。
解决方案
Rust 没有直接修改字节的功能。但是,它确实具有将整数转换为字节数组以及将字节数组转换为整数的方法。例如,一个人可能会写
fn set_low_byte(number:u32, byte:u8)->u32{
let mut arr = number.to_be_bytes();
arr[3] = byte;
u32::from_be_bytes(arr)
}
还有一些小字节序和原生字节序的方法。位掩码方法也是完全可行的,如果你不介意,指针的东西也可以工作unsafe
。
推荐阅读
- android - ViewPager 中的项目在滑回页面时消失并重新出现
- python - 给定另一列的值,减去熊猫数据框中的连续时间帧
- javascript - 根据窗口大小改变功能
- ios - 如何检查应用程序是否已更新?
- arm - 使用硬件参考手册和配置寄存器设置中断
- javascript - 替换 onmouseover 和 onmouseout 的图像
- python - 在不删除 Python 上的前导零的情况下从 HEX 字符串转换为 int
- python - pandas `.xs` 方法的奇怪行为
- xcode - StoreKit 警报控制器
- javascript - 在调度程序的视图中显示信息