Это правильный способ выполнения байтового ввода-вывода?

Я пытаюсь записать байты в файл в двоичном формате, и я написал эту небольшую тестовую программу, чтобы проверить, правильно ли я это делаю.

std::uint8_t F = 10111001;

std::ofstream K("C:/Users/WDR/Desktop/kml.enc", std::ios::binary);

for(int i = 0; i < 256; i++)
{
    K << F;
}

Файл пишется правильно. Я получаю файл размером 256 байт. Однако, когда я вижу это в шестнадцатеричном редакторе, каждый байт показывает значение 00011001. Я делаю что-то неправильно? Или байты представлены по-разному, когда они видны в шестнадцатеричном редакторе? Просьба уточнить. Спасибо.


person WDRKKS    schedule 09.04.2015    source источник


Ответы (1)


10111001 не является двоичным числом. Это десятичное число. Присвоение этого числа uint8_t даст вам 10111001 % 256, что равно 25 или 11001 в двоичном формате.

вы хотите написать std::uint8_t F = 0xB9;

person mch    schedule 09.04.2015
comment
Итак, если я читаю из файла в std::vector<std::uint8_t>, должен ли я добавлять префикс 0x к каждому прочитанному байту, чтобы правильно записать его в другой файл? Кроме того, что означает 0x и можно ли его использовать для двоичных представлений? Если нет, то как мне записать двоично представленные байты в файл? Преобразовать их в шестнадцатеричный формат? Просьба уточнить. Спасибо за ваш ответ. - person WDRKKS; 09.04.2015
comment
префикс 0x перед числом означает, что это шестнадцатеричное число. Для двоичных чисел нет префикса, поэтому, если вы хотите использовать двоичное число в своем коде на С++, вы должны использовать его шестнадцатеричное представление с префиксом 0x, его восьмеричное представление с префиксом 0 или его десятичное представление без префикса. Но это только представление: 0xB9, 185 и 0271 — одно и то же число. - person mch; 09.04.2015
comment
Если вы читаете из файла и записываете в другой файл, вам не нужно думать о базе. Каждый компьютер имеет только двоичные числа, ваша проблема заключается в представлении чисел в вашем файле С++. Префикс 0b для двоичных файлов не существует в С++, но, например, в Java. - person mch; 09.04.2015
comment
Спасибо, что подтвердили это, @mch. Я проверил это, и действительно, мне не нужно беспокоиться об этом в этом случае. Однако как насчет случая, когда мне нужно записать в файл коды Хаффмана? Я генерирую их в программе C++, и они представлены в виде строк 0 и 1. Весь файл закодирован в std::vector<bool>, из которого я могу накапливать их по 8 бит за раз в std::uint8_t. Как мне записать это std::uint8_t в файл? std:hex, а затем std::showbase? - person WDRKKS; 09.04.2015
comment
Я думаю, что вы должны просто записать значение в файл, который должен быть открыт в двоичном режиме. std::hex или std::showbase предназначены для вывода текста, а не для двоичных файлов. - person mch; 09.04.2015
comment
Но будет ли это нормально работать? Смогу ли я вернуть то же значение, которое я написал, когда прочитаю его для последующей распаковки? Потому что, если я это сделаю, я получу ту же проблему, что и мой первоначальный вопрос выше. В файл будет записан символ, содержащий десятичное значение. - person WDRKKS; 09.04.2015