4

所以。我一直在试验 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 字节值之间写入零是什么?

4

3 回答 3

4

因为 1(例如)表示为 4 字节十六进制是00000001. 显然你在一个小端系统上,因此当你检查你的文件时显然是从后到前的顺序。

于 2013-02-04T22:09:24.783 回答
3

您的 hexdump 将两个字节组合为一个单词并更改字节顺序。在大多数系统上,使用hexdump -C将转储更改为可防止分组的规范视图。在十六进制中,一个字符代表一个 nybble,每个字节有两个 nybbles。所以你的 4 字节int总共应该有 8 个 nybbles。由于您的数字非常小,因此您的大多数 nybbles 都是 0。

于 2013-02-04T22:14:52.843 回答
2

我认为您误解了输出中一个字节的大小 - 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 机器。

于 2013-02-04T22:09:35.833 回答