如何在Rust中操作缓冲区

  • 本文关键字:操作 缓冲区 Rust rust
  • 更新时间 :
  • 英文 :


几周前,我对Rust感兴趣。到目前为止,我只读过在线教程,想知道如何在Rust中操作缓冲区内存。假设我有这样的C代码:

int main()
{
char buffer[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa };
int a = *(int*)&buffer[0];
a = 0xdeadc0de;
short b = *(short*)&buffer[4];
b = 0xbadf;
*(int*)&buffer[0] = a;  
*(short*)&buffer[4] = b; 
//buffer memory: de c0 ad de df ba 77 88 99 aa
return 0;
}

有人能用Rust写这个吗?我认为《铁锈》中没有选角,对吧?

通过转换引用直接操作缓冲区在Rust中被认为是不安全的。当然,您可以使用unsafe关键字直接写入内存,但这将否定使用Rust的整个安全优势。

您可以创建u32将其转换为[u8]数组,然后将其写入缓冲区。但是,您无法安全地从缓冲区获取&u32引用。

fn main() {
let mut buffer = vec![0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa];
let a: u32 = 0xdeadc0de;
let a_bytes = a.to_le_bytes();
buffer[0..4].copy_from_slice(&a_bytes);
let b: u16 = 0xbadf;
let b_bytes = b.to_le_bytes();
buffer[4..6].copy_from_slice(&b_bytes);
println!("{:x?}", buffer);
}
[de, c0, ad, de, df, ba, 77, 88, 99, aa]

仅供参考,这是unsafe代码的外观。不过,我强烈反对这种解决方案。

fn main() {
let mut buffer: Vec<u8> = vec![0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa];
unsafe {
let ptr = buffer.as_mut_ptr();
let a = ptr.offset(0) as *mut u32;
*a = 0xdeadc0de;
let b = ptr.offset(4) as *mut u16;
*b = 0xbadf;
}
println!("{:x?}", buffer);
}
[de, c0, ad, de, df, ba, 77, 88, 99, aa]

请注意,unsafe解决方案的行为与安全解决方案完全相同。如果在big-endian体系结构上编译,它将翻转字节。

这就是to_le_bytes所防止的。

最新更新