我正在尝试将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
答案 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。