比较大文件
Comparing big files
所以我有非常大的 .bin
文件,其中写有 bytes
。他们有 96-bit
数字写成 two's complement
数字(仍然没有 ASCII,只有字节)。现在我必须编写一个汇编程序来对这个文件中的数字进行排序并将其保存到另一个文件中(不要问为什么,assembly
class)。我已经为具有 32k
个数字的文件完成了此操作,如下所示:
./main < inSort32Kx96b.bin > XD.bin
diff outSort32Kx96b.bin XD.bin
文件outSort32Kx96b.bin
是老师给我的。所以现在 diff
不输出任何东西,它们是相同的(我可以用 hexdump
或 mcview
来检查)。但是我得到了另一个文件 inSort1Kx96b.bin
。我也对它进行排序。但随后 diff 说:
Binary files outSort1Kx96b.bin and XD.bin differ
@编辑:
cmp
给出了这两个文件不同的字节数。现在我可以看出区别了:
所以区别出现在0x000017C0
。那我现在不知道了。如果按little endian
顺序写成two's complement
个数,那么哪个大,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
?
十六进制转储以大端顺序显示单个字节。如果一堆字节必须解释为数字,只有字节顺序颠倒了。
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
可以看到第一个数比较大
"Two's complement number" 不是很清楚的表达。更好的是"signed integer"。表示数字是正数还是负数的符号是数字的第一位。该位可以在大端序号的开头和小端序号的末尾找到。
正:
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
所以我有非常大的 .bin
文件,其中写有 bytes
。他们有 96-bit
数字写成 two's complement
数字(仍然没有 ASCII,只有字节)。现在我必须编写一个汇编程序来对这个文件中的数字进行排序并将其保存到另一个文件中(不要问为什么,assembly
class)。我已经为具有 32k
个数字的文件完成了此操作,如下所示:
./main < inSort32Kx96b.bin > XD.bin
diff outSort32Kx96b.bin XD.bin
文件outSort32Kx96b.bin
是老师给我的。所以现在 diff
不输出任何东西,它们是相同的(我可以用 hexdump
或 mcview
来检查)。但是我得到了另一个文件 inSort1Kx96b.bin
。我也对它进行排序。但随后 diff 说:
Binary files outSort1Kx96b.bin and XD.bin differ
@编辑:
cmp
给出了这两个文件不同的字节数。现在我可以看出区别了:
所以区别出现在0x000017C0
。那我现在不知道了。如果按little endian
顺序写成two's complement
个数,那么哪个大,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
?
十六进制转储以大端顺序显示单个字节。如果一堆字节必须解释为数字,只有字节顺序颠倒了。
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
可以看到第一个数比较大
"Two's complement number" 不是很清楚的表达。更好的是"signed integer"。表示数字是正数还是负数的符号是数字的第一位。该位可以在大端序号的开头和小端序号的末尾找到。
正:
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