我在写Vec<u16>
内容到文件时遇到了问题:
use std::fs::File;
use std::io::{Write, BufWriter};
use std::mem;
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum ImageFormat {
GrayScale,
Rgb32,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct ImageHeader {
pub width: usize,
pub height: usize,
pub format: ImageFormat,
}
pub struct Image {
pub header: ImageHeader,
pub data: Vec<u16>,
}
fn write_to_file(path: &str, img: &Image) -> std::io::Result<()> {
let f = try!(File::create(path));
let mut bw = BufWriter::new(f);
let slice = &img.data[..];
println!("before length: {}", slice.len());
let sl: &[u8];
unsafe {
sl = mem::transmute::<&[u16], &[u8]>(slice);
}
println!("after length: {}", sl.len());
try!(bw.write_all(sl));
return Ok(());
}
fn main() {}
由于write_all()
要求使用&[u8]
,因此我正在对&[u16]
进行不安全的转换以获得&[u8]
。由于转换不会改变切片长度(slice.len()
和sl.len()
具有相同的值),因此仅输出了图像数据的一半到文件中。
如果我不需要任何不安全的转换或复制,那将更好。
slice::from_raw_parts()
的方法,它完美地工作了。 - rillomasbyteorder
方法!现在ARM机器非常普遍,不仅仅是手机,新的Mac也是。如果您正在使用from_raw_parts
,那么在x86机器上保存的文件(大多数Windows和桌面Linux)将无法从手机或新的Mac上读取。 - Kroltanfwrite
。虽然可能不太可移植和不安全,但在内存有限的情况下,这是一种更快速的转储或读取大型临时文件的方法。第二种方法更具可移植性和安全性,但似乎我们必须逐个元素进行新的内存分配和转换为字节。感谢您提供的精彩答案。 - gbinux