我使用truncate
文件来检查我的软件在不完整文件上的行为,结果完全出乎意料。我开始挖掘并最终来到这里。
>cp full truncated
>truncate -s 2485129215 truncated
>ls -la
-rw-r--r-- 1 yuki yuki 2485129215 Mar 6 14:30 truncated
-rw-r--r-- 1 yuki yuki 2485129216 Mar 6 14:24 full
我希望这truncated
与full
没有最后一个字节的情况相同。但不是,我跑xxd
了这些并比较了diff
- 很多千兆字节的差异,很难理解。
我用python写了一个哑字节比较程序。
import os
f1 = open('./full', 'r')
f2 = open('./truncated', 'r')
s1 = os.stat('./full').st_size
s2 = os.stat('./truncated').st_size
print('size1 {}'.format(s1))
print('size2 {}'.format(s2))
s = min(s1, s2)
print('min={}'.format(s))
i = 0
while i < s:
b1 = f1.read(1)
b2 = f2.read(1)
if b1 != b2:
print("{} {:02x} != {:02x}".format(i, ord(b1[0]), ord(b2[0])))
break
i += 1
返回
size1 2485129216
size2 2485129215
min=2485129215
1288204320 44 != e8
好的,试着看看xxd
>xxd -o 1288204320 -l 5 ./full
4cc87020: 2a00 0000 00 *....
看起来不像...运行这个
>xxd -o 1288204319 -l 5 ./full
4cc8701f: 2a00 0000 00
严重地?为什么看起来和之前的一模一样?
linux工具有什么问题,或者我使用它?我在常规的 Ubuntu 18.04 上。会不会是truncate
andxxd
只接受某种低数字而溢出?有任何想法吗?
顺便说一句,运行head -c 2485129215 full > truncated
给出了预期的结果。万岁!至少有些东西确实有效。