所以。我一直在试验 fwrite()。
在我的系统 sizeof(int) = 4。我有一个整数数组,其中包含:1、2、3、4、5 和 6。
当我将它写入二进制文件并使用 hexdump 查看它时,我得到:
0000000 0001 0000 0002 0000 0003 0000 0004 0000
0000010 0005 0000 0006 0000
0000018
它在 4 字节值之间写入零是什么?
因为 1(例如)表示为 4 字节十六进制是00000001
. 显然你在一个小端系统上,因此当你检查你的文件时显然是从后到前的顺序。
您的 hexdump 将两个字节组合为一个单词并更改字节顺序。在大多数系统上,使用hexdump -C
将转储更改为可防止分组的规范视图。在十六进制中,一个字符代表一个 nybble,每个字节有两个 nybbles。所以你的 4 字节int
总共应该有 8 个 nybbles。由于您的数字非常小,因此您的大多数 nybbles 都是 0。
我认为您误解了输出中一个字节的大小 - 8 位需要两个十六进制数字才能完全表示。您的示例中的一个单曲int
是:
0001 0000
您可能希望显示为 32 位数据(或 8 位数据)而不是 16。这就是让您的转储看起来很奇怪的原因。
我复制了您的二进制文件并od
使用了几个不同的选项运行。希望你能发现这个例子很有启发性:
$ od -t x4 example
0000000 00000001 00000002 00000003 00000004
0000020 00000005 00000006
0000030
$ od -t x2 example
0000000 0001 0000 0002 0000 0003 0000 0004 0000
0000020 0005 0000 0006 0000
0000030
$ od -t x1 example
0000000 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
0000020 05 00 00 00 06 00 00 00
0000030
正如您从 1 字节和 4 字节示例中所看到的那样,我也像您一样使用 little-endian 机器。