首页 > 解决方案 > 在 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

解决方案


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

游乐场链接


推荐阅读