【问题标题】:Copy binary file in vector在向量中复制二进制文件
【发布时间】:2020-08-30 09:39:37
【问题描述】:

我正在尝试通过编写一个模拟器来熟悉 Rust(并学习它)。 我需要将一个文件(我的 rom 图像)加载到一个向量中,即我的模拟 ram。

这是我的代码:

let image = std::fs::read(filepath).ok().unwrap();
let mut i = 0;
for n in image {
    self.memory[400 + i] = n;
    i += 1;
}

内存是一个用全零初始化的Vec<u8> (memory: vec![0; 4*1024])。 现在有了这段代码,我没问题,它可以满足我的要求,但是我有更好(更快/更紧凑)的方法吗?

【问题讨论】:

  • std::fs::read(filepath) 已经返回Vec<u8>。唯一的区别是您希望前 400 个字节为零?
  • @ÖmerErden 我正在像数组一样使用 Vector(我知道我应该只使用数组,但我这样做是为了更适应语言)因为我的模拟器的内存是固定的在 4K 时,我在地址 400 处加载图像,所以我希望从该点复制图像,使内存的其余部分保持不变(如果另一个地址为 0,则它们保持为零,依此类推)。跨度>
  • Vec::splice 可以完成这项工作:play.rust-lang.org/…,如果您使用返回的迭代器,它还可以提供替换元素。

标签: rust


【解决方案1】:

我有更好(更快/更紧凑)的方法吗?

是的。 std::fs::read 是一个便利函数,它分配一个缓冲区并将数据读入其中,并随着数据的到达而增长。由于您已经拥有一个预先分配的向量并且不想调整大小,您可以使用BufRead::read 直接读取它而无需进行不必要的分配。如果您的 ROM 大小是固定的,您可以通过调用 read_exact 来读取数据:

let mut file = BufReader::new(File::open(filepath)?);
file.read_exact(&mut self.memory[400..400 + ROM_SIZE])?;

这将避免不必要的分配和复制。当然,在许多情况下,它不会对实践产生影响,但由于您的目标是学习,因此了解最有效的方法是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多