Сжатие файла с усечением, головой и проверкой по xxd - PullRequest
1 голос
/ 06 марта 2020

Я использую 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 и xxd принимают только какие-то младшие числа и в противном случае переполняются? Есть идеи?

Кстати, запуск head -c 2485129215 full > truncated дает ожидаемый результат. Houray! По крайней мере, что-то работает.

...