Сброс битов / байтов в файл в двоичном режиме - PullRequest
0 голосов
/ 17 июня 2009

У меня есть код ниже.

FILE *fp;
int a;
fp=fopen("dump.bin","wb");         
a = 0xffafbcdf;
fprintf(fp,"%x",a&0x3ffff);

Я пытаюсь сбросить только 18 младших бит переменной a. Но значение, выгружаемое в файл - 3bcdf.

Мой вопрос - не возможно ли вывести / fwrite / fprintf желаемое количество битов, которое не кратно 4 (клев) в файл?

EDIT:

1.) Когда я проверил вывод моего дампа, я понял, что поскольку я открываю файл в двоичном режиме, я не должен использовать fprintf, но я должен использовать fwrite.

2.) То, что я вижу в выходных данных, это DF BC 03, он записывает кратно 8 битам, поэтому он записывает 24 бита (3 байта), но меня интересовали только 18 бит. Но потом я понял, что ни одна библиотека записи файлов не сможет записать в файл не кратные 8 битам. он всегда добавляет начальные нулевые биты для завершения байта, а затем выводит его. «Наименьшая единица подсчета» для файла данных представляет собой байт.

Ответы [ 3 ]

1 голос
/ 17 июня 2009

Как уже говорили, символ - это объект минимального размера, который вы можете записать в файл. Я просто хотел бы заметить, что нет ничего плохого в использовании fprintf () (или любой другой функции вывода потока) в двоичных файлах.

0 голосов
/ 17 июня 2009

Файлы записываются в байтах (8 бит), а не в полубайтах (4 бита).

Правка после редактирования: fprintf напечатает текст, поэтому вы получите 6 байтов, где, как если бы вы использовали fwrite, вы записали в файл целое число (32 бита), но замаскировали записанное значение.

0 голосов
/ 17 июня 2009

0x3bcdf - это 18 младших битов 0xffafbcdf, так что, похоже, все работает как положено. Чего ты ожидал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...