如何在Rust中操作缓冲区内存?附C代码转Rust需求
如何用Rust实现C风格的缓冲区内存操作?
Rust确实没有C语言里那种直接的强制类型转换,但可以通过**不安全代码块(unsafe)**实现类似的内存指针操作——这类操作会绕过Rust的安全检查,需要你自行保证内存访问的合法性(比如缓冲区长度足够、内存对齐正确等)。
下面是和你提供的C代码逻辑完全一致的Rust实现:
fn main() { // 初始化字节缓冲区,对应C中的char数组 let mut buffer: [u8; 10] = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa]; unsafe { // 从缓冲区起始地址读取4字节,转换为i32(对应C的int) let mut a = *(buffer.as_ptr() as *const i32); a = 0xdeadc0de; // 将修改后的值写回缓冲区起始位置 *(buffer.as_mut_ptr() as *mut i32) = a; // 从缓冲区第5个字节(索引4)处读取2字节,转换为i16(对应C的short) let mut b = *(buffer.as_ptr().add(4) as *const i16); b = 0xbadf; // 将修改后的值写回缓冲区对应位置 *(buffer.as_mut_ptr().add(4) as *mut i16) = b; } // 打印验证内存内容,小端平台(如x86)下会输出目标结果 println!("buffer memory: {:x?}", buffer); }
关键细节说明:
buffer.as_ptr()/buffer.as_mut_ptr():分别获取缓冲区的不可变/可变原始指针,类型为*const u8/*mut u8。- 指针类型转换(
as *const i32/as *mut i16):必须放在unsafe块中,因为Rust无法自动验证这类转换的安全性。 - 字节序依赖平台:这段代码的内存结果和C一样,取决于平台的字节序。在小端平台(如常见的x86架构)下,最终缓冲区内容会和你注释的
de c0 ad de df ba 77 88 99 aa一致;大端平台结果会不同。
如果你想脱离平台字节序的限制,明确控制读写的字节序,可以使用byteorder crate实现安全的内存操作,无需unsafe块:
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::io::Cursor; fn main() { let mut buffer: [u8; 10] = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa]; // 以小端模式读取缓冲区起始的4字节为i32 let mut a = Cursor::new(&buffer).read_i32::<LittleEndian>().unwrap(); a = 0xdeadc0de; // 以小端模式将值写回缓冲区起始位置 let mut cursor = Cursor::new(&mut buffer); cursor.write_i32::<LittleEndian>(a).unwrap(); // 以小端模式读取缓冲区索引4开始的2字节为i16 let mut cursor = Cursor::new(&buffer[4..]); let mut b = cursor.read_i16::<LittleEndian>().unwrap(); b = 0xbadf; // 以小端模式将值写回对应位置 let mut cursor = Cursor::new(&mut buffer[4..]); cursor.write_i16::<LittleEndian>(b).unwrap(); println!("buffer memory: {:x?}", buffer); }
内容的提问来源于stack exchange,提问作者krusty
相关产品推荐
相关产品推荐

