我目前正在编写一个存储'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'值的存在。其次,如何将这些值转换回小数(即返回原始数值)?我所咨询的来源之间的共识似乎暗示没有标准的方法(我理解,因为我正在处理通用的二进制输出),但是我可以用什么方式处理我的特定转换数据呢? / p>
感谢您的帮助!
编辑: 添加'fread'位代码后,我收到了输出:
5
0
10416
49150
0
答案 0 :(得分:3)
使用hexdump -x
或od -x
检查输出时,您会看到
0000000 0000 0001 0002 0003 0004
000000a
最左边的列是十六进制的偏移量。两个实用程序都输出一个没有任何数据的最终地址,以显示解析的字节数。
换句话说,输出包含0x0a
= 10个字节,可以解释为5个16位字:0x0000
= 0,0x0001
= 1,{{1} } = 2,0x0002
= 3,0x0003
= 4。
如果您只想要十六进制字,每行一个字,请使用0x0004
。对于十进制字,请使用od -v -An -w2 -t x2
。
有关输出的详细信息,请参阅man 1 od
或man 1 hexdump
。
答案 1 :(得分:1)
第一个000000
是文件的偏移量。由于该数据来自文件的开头,因此偏移量为0
。 000000a
是文件总大小 - 在您的情况下为10个字节(5个数组条目乘以每个条目2个字节)。通常该行将在数据的新行上;你确定你正确复制/粘贴了吗?
以下是我的机器中的一些示例,其中包含程序的输出:
$ hexdump test.bin # traditional hexdump output
0000000 00 00 01 00 02 00 03 00 04 00
000000a
$ hexdump -d test.bin # two-byte decimal output
0000000 00000 00001 00002 00003 00004
000000a
$ hexdump -x test.bin # two-byte hexadecimal output
0000000 0000 0001 0002 0003 0004
000000a
如果要从二进制文件生成一些十进制输出,则需要向hexdump提供一些格式信息:
$ hexdump -e '5/2 "%d " "\n"' test.bin
0 1 2 3 4
或者,只需在程序中使用fprintf
创建程序输出文本,而不是二进制数据。将fwrite
来电替换为:
for (int i = 0; i < sizebuf; i++)
fprintf(fpbin, "%d\n", buff[i]);
进行更改后的输出:
$ cat test.bin
0
1
2
3
4
答案 2 :(得分:-1)
0000000实际上是指行号。它不在二进制文件中,而是由十六进制转储应用程序生成。您的第二行将包含00000010,表示每行号最多16个字节
每行以换行符结束,换行符为ascii 0xa。每一行都将以此结束。
将每个字节转换为数字,然后使用itoa获取ascii值。