比较大文件

时间:2017-03-31 05:21:45

标签: linux file assembly diff

所以我写了很大.binbytes个文件。它们将96-bit个数字写在two's complement个数字中(仍然没有ASCII,只有字节)。现在我必须编写一个汇编程序来对这些文件中的数字进行排序并将其保存到另一个文件中(不要问为什么,assembly类)。我已经为包含32k个数字的文件完成了这样的操作:

./main < inSort32Kx96b.bin > XD.bin
diff outSort32Kx96b.bin XD.bin

文件outSort32Kx96b.bin由我的老师提供给我。所以现在diff不输出任何内容,它们是相同的(我可以使用hexdumpmcview来检查)。但是我得到了另一个文件inSort1Kx96b.bin。我也对它进行排序。但后来差异说:

Binary files outSort1Kx96b.bin and XD.bin differ

@Edit:

cmp给出了这两个文件不同的字节数。现在我可以看出差异:

enter image description here

所以差异来自0x000017C0。那我现在不知道。如果它们以two's complement顺序写成little endian个数字,那么哪一个更大,f.e

00 00 00 00  00 00 00 81  00 00 00 00

00 00 00 00  00 00 00 7F  00 00 00 00

1 个答案:

答案 0 :(得分:1)

hexdump以big endian顺序显示单个字节。如果必须将一堆字节解释为数字,则只反转字节顺序。

little endian                           big endian (C notation)
AB CD EF                              = 0xEFCDAB
01 02 03 04  05 06 07 08  09 10 11 12 = 0x121110090807060504030201

让我们将您的示例翻译成大端序:

0x000000008100000000000000
0x000000007F00000000000000

你可以看到第一个数字更大。

“两个补数”并不是一个非常明确的表达。更好的是“有符号整数”。显示数字是正数还是负数的符号是​​数字的第一位。这个位可以在大端数字的开头和小端数字的结尾找到。

<强>正

00 00 00 00  00 00 00 81  00 00 00 00 = 0x000000008100000000000000
00 00 00 00  00 00 00 81  00 00 00 10 = 0x100000008100000000000000
00 00 00 00  00 00 00 81  00 00 00 7F = 0x7F0000008100000000000000

<强>是负面的:

00 00 00 00  00 00 00 81  00 00 00 80 = 0x800000008100000000000000
00 00 00 00  00 00 00 81  00 00 00 CD = 0xCD0000008100000000000000
00 00 00 00  00 00 00 81  00 00 00 F0 = 0xF00000008100000000000000