我目前正在编写一个程序,用于存储“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
最佳答案
当您使用 hexdump -x
或 od -x
检查输出时,您会看到
0000000 0000 0001 0002 0003 0004
000000a
最左边的列是十六进制的偏移量。这两个实用程序都输出一个没有任何数据的最终地址,以显示已解析的字节数。
换句话说,输出包含 0x0a
=10 个字节,可以解释为五个 16 位字:0x0000
=0, 0x0001
=1,0x0002
=2,0x0003
=3,0x0004
=4。
如果您只想要十六进制单词,每行一个单词,请使用 od -v -An -w2 -t x2
。对于十进制字,使用 od -v -An -w2 -t d2
。
请参阅man 1 od
或 man 1 hexdump
有关输出的更多详细信息。
关于c - 将二进制解析为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17956303/