如何使用Rust创建二进制文件?

时间:2018-12-18 04:24:08

标签: file rust binaryfiles

我可以用Rust将二进制代码写入文件。但是,当我创建文件时,创建的文件是文本文件,而不是二进制文件。 我可以像这样用C ++创建一个二进制文件:

ofstream is("1.in", ofstream::binary | ofstream::out | ofstream:: trunc);

在Rust中怎么样?这是我的尝试:

struct IndexDataStructureInt {
    row: u32,
    key_value: u32,
}

let mut index_arr: Vec<IndexDataStructureInt> = Vec::new();
// doing something push 100 IndexDataStructureInt to index_arr
let mut fileWrite = File::create(tableIndexName).unwrap();
for i in 0..index_arr.len() {
    write!(
        fileWrite,
        "{:b}{:b}",
        index_arr[i].row, index_arr[i].key_value
    );
}

运行此代码后,它将200 u32整数二进制数写入文件tableIndexName。但是,文件大小不是800bytes。大约是4KB。

1 个答案:

答案 0 :(得分:8)

Rust的docker run <name> <arguments> 没有以文本或二进制模式打开文件的概念。所有文件均以“二进制”文件打开,并且不执行换行和回车之类的字符转换。

您的问题源于使用write!宏。此宏用于将数据格式化为可打印格式,如果要写入二进制数据,则不应使用该宏。实际上,您使用的{:b} format specifier会将值转换为可打印的ASCII字符串iptables v1.6.0: can't initialize iptables table `nat': Permission denied (you must be root) Perhaps iptables or your kernel needs to be upgraded. std::fs::File的二进制字符串。

相反,请使用特征std::io::Write提供的功能。此特征由1直接实现,或者您可以使用0以获得更好的性能。

例如:在这里,我使用FileBufWriter的一部分写入文件,然后使用write_all将同一文件读回到u8

read_to_end