Как fprintf INT в двоичный файл в C? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь записать двоичное число 16-разрядного целого числа со знаком в файл.Я много искал и, конечно, я нашел много примеров, которые преобразовывают целочисленные переменные в двоичные.Но в моем случае эти функции не будут эффективными, потому что мне нужно конвертировать 50e6 выборок / с.Вызов функции для преобразования каждого семпла потребует много вычислительного времени.

Итак, я хочу сделать следующее:

int array[] = {233, 431, 1024, ...}
for (i = 0; i < sizeof(array); i++){
    fprintf(outfile, "%any_binary_format \n", array[i]);
}

результат в файле должен быть:

0000000011101001
0000000110101111
0000010000000000

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Если вы хотите использовать printf, вы можете использовать что-то вроде этого:

#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c\n"
#define BYTE_TO_BINARY(byte)  \
  (byte & 0x80 ? '1' : '0'), \
  (byte & 0x40 ? '1' : '0'), \
  (byte & 0x20 ? '1' : '0'), \
  (byte & 0x10 ? '1' : '0'), \
  (byte & 0x08 ? '1' : '0'), \
  (byte & 0x04 ? '1' : '0'), \
  (byte & 0x02 ? '1' : '0'), \
  (byte & 0x01 ? '1' : '0')

int main()
{
   uint8_t value = 5;  
   printf(BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(value));
   return 0;
}

Следует напечатать 00000101. Я использую это иногда во встроенном коде при отладке для проверки значений регистра.Просто замените printf на fprintf, если вы хотите записать двоичные строки ascii в файл.

0 голосов
/ 24 сентября 2018

fprintf предназначен для форматированного вывода - форматирование является «читаемым человеком» текстом, поэтому его нельзя использовать, если вы хотите двоичный вывод.Для этого вы должны использовать fwrite():

for (i = 0; i < sizeof(array) / sizeof(*array); i++ )
{
    fwrite (&array[i], sizeof(*array), 1, outfile ) ;
}

Примечание. Я также исправил завершение вашего цикла, чтобы правильно итерировать количество элементов в массиве.Но на самом деле цикл не нужен - вывод является двоичным, массив - двоичным - вы можете просто вывести весь массив таким образом:

fwrite( array, sizeof(array), 1, outfile ) ;

Ваше требование к производительности в 50 Мбит / с потребует производительности записи около 95 Мбит / с.устойчивый - это много, чтобы спросить, и вряд ли будет достигнуто путем написания одного образца за один раз.Возможно, вам лучше использовать файл с отображенной памятью, но если вы не используете ОС реального времени, нет никаких гарантий, что вы будете поддерживать эту скорость вывода бесконечно - для доступа к диску требуется только другой процесс, и это может привести кнедопустимая задержка.

Также обратите внимание, что файл должен быть открыт для двоичного вывода - особенно в Windows, чтобы предотвратить преобразование CR в CR + LF, что будет иметь катастрофические последствия для ваших примеров данных.

...