gpt4 book ai didi

rust - 在 Rust 中修改单个字节

转载 作者:行者123 更新时间:2023-12-03 11:46:46 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Converting number primitives (i32, f64, etc) to byte representations

(5 个回答)


去年关闭。




在 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 中执行直接字节操作方法。虽然它有一些掩码没有的字节序问题,但我认为这些都可以在编译时解决以提供一个安全的跨平台接口(interface),那么为什么在安全的 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,指针的东西也可以使用。 .
playground link

关于rust - 在 Rust 中修改单个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66159985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com