如何使用C将fprintf int转换为二进制?

时间:2018-09-24 16:15:36

标签: c types binary format

我正在尝试将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 :(得分:1)

fprintf用于格式化输出-格式化为“人类可读”文本,因此,如果要二进制输出,则不适合使用此功能。为此,您应该使用fwrite()

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

注意,我还修复了循环终止,以正确地迭代数组中的元素数。但是实际上循环是不必要的-输出是二进制的,数组是二进制的-您可以这样输出整个数组:

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

您对50Msps的性能要求将要求持续保持约95Mb / s的写入性能-这是一个很大的要求,并且不可能一次写入一个样本来实现。使用内存映射文件可能会更好,但是除非使用实时操作系统,否则无法保证您无限期地维持该输出速率-只需花费一些其他过程即可访问驱动器,并且可能会引入不能接受的延迟。

还请注意,必须已打开文件以输出 binary -特别是在Windows上,以防止将CR转换为CR + LF,这将对示例数据造成灾难性的后果。

答案 1 :(得分:0)

如果要使用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。调试调试寄存器值时,有时会在嵌入式代码中使用它。如果要将ascii二进制字符串写入文件,只需用fprintf替换printf。