【问题标题】:Comparing big files比较大文件
【发布时间】:2017-03-31 05:21:45
【问题描述】:

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

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

文件outSort32Kx96b.bin是我的老师给我的。所以现在diff 不输出任何东西,它们是相同的(我可以用hexdumpmcview 来检查)。但我得到了另一个文件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

?

【问题讨论】:

  • 这里离题,和操作系统有关。在 Linux 上使用cmp(1)diff(1),您也可以在od(1)hd 的输出中使用它们。而且不要太确定你的程序是好的。
  • 我刚刚说过,我很确定,因为它适用于更大数量的数字,为什么会在这里崩溃:D
  • 我完全不明白为什么你的 96 位数字、程序集、庞大的文件和屏幕截图如此复杂的问题,而在一天结束时你只是想要询问如何在 linux 中进行十六进制转储,在这种情况下,只需在谷歌上搜索“linux hex dump”就会产生大量结果。
  • 当我们谈到“hexdump”时,我们并不是指“在支持 hexdump 视图的编辑器中打开”。我们的意思是“通过一个程序管道它,该程序将为您提供包含原始文件的十六进制转储的新文本文件”。所以,这个想法很简单:如果你不能在 linux 中轻松比较两个二进制文件,(甚至可能有办法做到这一点,但假设没有,)那么你需要做的就是让每个二进制文件十六进制转储到文本文件中,然后在文本文件上运行 ascii diff。
  • 我认为你没有正确理解迈克。这样做:hexdump file1.bin &gt; file1.dat; hexdump file2.bin &gt; file2.dat; diff file1.dat file2.dat

标签: linux file assembly diff


【解决方案1】:

十六进制转储以大端顺序显示单个字节。如果必须将一堆字节解释为数字,则只需颠倒字节顺序即可。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多