Как я могу записать шестнадцатеричные числа вместо &[u8] в файл

Стандартные функции write_all и write из крейта std::fs позволяют записывать фрагменты строк (технически &[u8]?) в файлы.

Есть ли способ записать шестнадцатеричные числа непосредственно в файл?


person MEisebitt    schedule 11.01.2020    source источник
comment
Как вы представляете шестнадцатеричные числа? Как струны?   -  person SCappella    schedule 12.01.2020
comment
@SCappella как числовой литерал, например. 0xff   -  person MEisebitt    schedule 12.01.2020
comment
Это означает, что это сводится к записи фрагментов числовых типов, отличных от u8, в файлы (если только все ваши шестнадцатеричные числа меньше 256, и в этом случае вы можете просто поместить их в &[u8] и записать это). Для этого см. этот вопрос. Две реализации: здесь или здесь.   -  person SCappella    schedule 12.01.2020
comment
Почему бы вам не опубликовать пример ввода, а также желаемый результат. Мне кажется, что вы хотите сделать следующее: format!("0x{:0>2X}", 15) -> "0x0F"   -  person richardpringle    schedule 13.01.2020


Ответы (1)


Вы можете использовать эту функцию:

use std::io::{Result, BufWriter, Write};

fn write_hex<W: Write>(file: &mut BufWriter<W>, data: &[u8]) -> Result<()> {
    for val in data {
        write!(file, "{:02X}", val)?;
    }
    Ok(())
}

игровая площадка

Поскольку он записывает каждое шестнадцатеричное число отдельно, требуется, чтобы вы использовали буферизованный поток. Вы можете создать его с помощью BufWriter::new(file). Вы можете изменить {:02X} на {:02x}, чтобы вместо этого писать шестнадцатеричный код нижнего регистра.

person Alice Ryhl    schedule 26.01.2020
comment
Небольшой функциональный штрих, если необходимо: Playground, также doc советует сбросить BufWriter перед удалением. - person Ömer Erden; 27.01.2020