我的二进制文件中的零是什么?

时间:2013-02-04 22:07:16

标签: c linux fwrite

因此。我一直在尝试使用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字节值之间写入零?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分: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字节的例子中看到的最好,我也像你一样在小端机器上。