【发布时间】:2013-07-30 20:01:43
【问题描述】:
我目前正在编写一个程序,该程序存储一个“uint16_t”数值数组,然后将它们写入二进制文件。由于大小考虑,我写入二进制文件(因为我将处理大量数据)。到目前为止,这是我的代码:
static int sizebuf=5;
int main(int argc, const char *argv[]){
uint16_t buff[sizebuf];
for(int i=0; i<sizebuf; i++){
buff[i]=i;
}
FILE *fpbin=fopen("test.bin","a+");
fwrite(buff, sizeof(uint16_t), sizeof(buff)/sizeof(uint16_t), fpbin);
rewind(fpbin);
uint16_t buffer[sizebuf];
fread(buff, sizeof(uint16_t), sizebuf, fpbin);
for (int i = 0; i < 5; i++)
{
printf("%" PRIu16 "\n",buffer[i]);
}
fclose(fpbin);
return 0;
}
当我使用“hexdump”检查“test.bin”中的输出时,我得到以下信息:
0000000 0000 0001 0002 0003 0004
000000a
首先,我不太确定我是否理解第一个“000000”和最后一个“00000a”值的存在。其次,我怎样才能将这些值转换回小数(即恢复为原始数值)?我咨询过的消息来源之间的共识似乎意味着没有标准的方法来做到这一点(鉴于我正在处理通用二进制输出,我理解这一点),但是我可以处理我的特定数据以进行转换的方法是什么?
感谢您的帮助!
编辑: 添加“fread”代码后,我收到了以下输出:
5
0
10416
49150
0
【问题讨论】:
-
只需使用
fread将值读回uint16_t。你是什么意思转换回ascii?printf应该能够做到所有这些。 -
“返回到 Ascii 文本”——一开始就不是“ASCII 文本”。您的意思可能是“回到十进制表示法”。
-
你确定最后一个
000000a不在下一行吗? -
感谢您的及时回复。我已经更新了上面的代码以反映 Bart 的建议。我还尝试了 '%d' 格式标识符。而且,是的,我的意思是回到十进制表示法。是的,00000a 在下一行。
-
您的
fread代码声明了buffer,但随后读入buff,因此当您打印出buffer的内容时,您正在打印未初始化的垃圾...
标签: c linux parsing binary ascii