Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Bash, cmp сравнение содержимого переменной с внешним файлом  (Прочитано 1550 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
Здравствуйте.
Нужно побайтовое сравнение содержимого файла рисунка с закачанным, через wget напр.
cmp говорит что разные, хотя точно знаю что они одинаковы.

Скачиваю в статический файл:
wget -O picture.gif сцылка
Скачиваю его же в переменную:
img=`wget -O- сцылка`
Сравниваю:
echo "$img" | cmp picture.gif
picture.gif - различаются: байт 8, строка 1

Так тоже:
echo -n "$img" | cmp picture.gif
picture.gif - различаются: байт 8, строка 1

Почему?

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Dexel, пример файла можно? Куда он заливается? Что говорит утилита compare из пакета imagemagick?

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
Однослойный GIF. Во вложении.

$ file picture.gif
picture.gif: GIF image data, version 89a, 18 x 18

Выяснилось вот что:
echo -n "$img" > picture2.gifИ файл этот короче, на целых 44 байта. Похоже что кодировка его коробит  :(

$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.utf-8"
LC_NUMERIC="ru_RU.utf-8"
LC_TIME="ru_RU.utf-8"
LC_COLLATE="ru_RU.utf-8"
LC_MONETARY="ru_RU.utf-8"
LC_MESSAGES="ru_RU.utf-8"
LC_PAPER="ru_RU.utf-8"
LC_NAME="ru_RU.utf-8"
LC_ADDRESS="ru_RU.utf-8"
LC_TELEPHONE="ru_RU.utf-8"
LC_MEASUREMENT="ru_RU.utf-8"
LC_IDENTIFICATION="ru_RU.utf-8"
LC_ALL=ru_RU.utf-8

Я скачиваю сравниваемый файл в переменную, лишь чтоб винт не ялозить. Слишком частые эти сравнения будут происходить. И важен результат сравнения. А сравниваемый файл будет сразу удаляться. Он не нужен.
Вобщем сейчас делаю закачку второго в файл, и затем обычное сравнение через cmp.
По идее он будет в кеш закидывать, а не диск протирать.
« Последнее редактирование: 05 Сентября 2014, 21:11:04 от Dexel »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Dexel,
нене, дай это img=`wget -O- сцылка`
Wars ~.o

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3031
    • Просмотр профиля
Раз cmp говорит, что разные, значит, не одинаковые. Я не знаю формата gif, знаю формат jpg.
Картинки могут быть одинаковыми, а заголовки отличаться.
Пётр.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Dexel, может на сервере происходит пересжатие или оптимизация.

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Дело в том, что bash экранирует все нулевые байты в переменных:

use@example:~/tmp$ echo `cat ./picture.gif` | hexdump -C
00000000  47 49 46 38 39 61 12 12  b3 41 41 41 98 98 98 f1  |GIF89a...AAA....|
00000010  f1 f1 c5 c5 c5 b9 b9 b9  21 f9 04 20 08 2c 12 12  |........!.. .,..|
00000020  08 74 11 08 1c 48 b0 a0  41 81 12 22 48 08 e0 e0  |.t...H..A.."H...|
00000030  40 02 22 42 94 e8 70 a1  80 01 01 20 62 6c 68 90  |@."B..p.... blh.|
00000040  e1 c5 8c 1f 19 12 9c 28  22 48 90 14 11 5e 1c 50  |.......("H...^.P|
00000050  32 23 c8 01 1b 1f 06 98  39 13 01 34 6b 8e 64 68  |2#......9..4k.dh|
00000060  93 c0 4d 9e 23 23 46 cc  78 53 a8 80 8c 0f 57 ba  |..M.##F.xS....W.|
00000070  84 a8 31 26 42 9a 26 a3  42 dd a9 f1 65 46 85 1d  |..1&B.&.B...eF..|
00000080  43 86 ac 88 b3 e6 54 ae  20 45 56 1c 4b 96 6c 40  |C.....T. EV.K.l@|
00000090  3b 0a                                             |;.|
00000092
user@example:~/tmp$ cat ./picture.gif | hexdump -C
00000000  47 49 46 38 39 61 12 00  12 00 b3 00 00 41 41 41  |GIF89a.......AAA|
00000010  98 98 98 f1 f1 f1 c5 c5  c5 b9 b9 b9 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 21 f9 04  |.............!..|
00000040  09 00 00 08 00 2c 00 00  00 00 12 00 12 00 00 08  |.....,..........|
00000050  74 00 11 08 1c 48 b0 a0  41 81 00 12 22 48 08 e0  |t....H..A..."H..|
00000060  e0 40 00 02 22 42 94 e8  70 a1 80 01 01 20 62 6c  |.@.."B..p.... bl|
00000070  68 90 e1 c5 8c 1f 19 12  9c 28 00 22 48 90 14 11  |h........(."H...|
00000080  5e 1c 50 32 23 c8 01 1b  1f 06 98 39 13 00 01 00  |^.P2#......9....|
00000090  34 6b 8e 64 68 93 c0 4d  9e 23 23 46 cc 78 53 a8  |4k.dh..M.##F.xS.|
000000a0  80 8c 0f 57 ba 84 a8 31  26 42 9a 26 a3 42 dd a9  |...W...1&B.&.B..|
000000b0  f1 65 46 85 1d 43 86 ac  88 b3 e6 54 ae 0a 45 56  |.eF..C.....T..EV|
000000c0  1c 4b 96 6c 40 00 3b                              |.K.l@.;|
000000c7

Используйте строковое представление (base64 / base64 -d или xxd -p / xxd -p -r) для кодирования таких данных, если вам необходимо хранить их в переменных bash. Например:

wget -O picture.gif ССЫЛКА
IMG=`wget -O- ССЫЛКА | xxd -p`
echo -ne "$IMG" | xxd -p -r | cmp ./picture.gif

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
Dexel,
нене, дай это img=`wget -O- сцылка`

victor00000, вот
img=`wget -O- http://status.mail.ru?ania.rivs@mail.ru`
Пользователь решил продолжить мысль 07 Сентября 2014, 16:31:23:
Дело в том, что bash экранирует все нулевые байты в переменных:

use@example:~/tmp$ echo `cat ./picture.gif` | hexdump -C
00000000  47 49 46 38 39 61 12 12  b3 41 41 41 98 98 98 f1  |GIF89a...AAA....|
00000010  f1 f1 c5 c5 c5 b9 b9 b9  21 f9 04 20 08 2c 12 12  |........!.. .,..|
00000020  08 74 11 08 1c 48 b0 a0  41 81 12 22 48 08 e0 e0  |.t...H..A.."H...|
00000030  40 02 22 42 94 e8 70 a1  80 01 01 20 62 6c 68 90  |@."B..p.... blh.|
00000040  e1 c5 8c 1f 19 12 9c 28  22 48 90 14 11 5e 1c 50  |.......("H...^.P|
00000050  32 23 c8 01 1b 1f 06 98  39 13 01 34 6b 8e 64 68  |2#......9..4k.dh|
00000060  93 c0 4d 9e 23 23 46 cc  78 53 a8 80 8c 0f 57 ba  |..M.##F.xS....W.|
00000070  84 a8 31 26 42 9a 26 a3  42 dd a9 f1 65 46 85 1d  |..1&B.&.B...eF..|
00000080  43 86 ac 88 b3 e6 54 ae  20 45 56 1c 4b 96 6c 40  |C.....T. EV.K.l@|
00000090  3b 0a                                             |;.|
00000092
user@example:~/tmp$ cat ./picture.gif | hexdump -C
00000000  47 49 46 38 39 61 12 00  12 00 b3 00 00 41 41 41  |GIF89a.......AAA|
00000010  98 98 98 f1 f1 f1 c5 c5  c5 b9 b9 b9 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 21 f9 04  |.............!..|
00000040  09 00 00 08 00 2c 00 00  00 00 12 00 12 00 00 08  |.....,..........|
00000050  74 00 11 08 1c 48 b0 a0  41 81 00 12 22 48 08 e0  |t....H..A..."H..|
00000060  e0 40 00 02 22 42 94 e8  70 a1 80 01 01 20 62 6c  |.@.."B..p.... bl|
00000070  68 90 e1 c5 8c 1f 19 12  9c 28 00 22 48 90 14 11  |h........(."H...|
00000080  5e 1c 50 32 23 c8 01 1b  1f 06 98 39 13 00 01 00  |^.P2#......9....|
00000090  34 6b 8e 64 68 93 c0 4d  9e 23 23 46 cc 78 53 a8  |4k.dh..M.##F.xS.|
000000a0  80 8c 0f 57 ba 84 a8 31  26 42 9a 26 a3 42 dd a9  |...W...1&B.&.B..|
000000b0  f1 65 46 85 1d 43 86 ac  88 b3 e6 54 ae 0a 45 56  |.eF..C.....T..EV|
000000c0  1c 4b 96 6c 40 00 3b                              |.K.l@.;|
000000c7

Используйте строковое представление (base64 / base64 -d или xxd -p / xxd -p -r) для кодирования таких данных, если вам необходимо хранить их в переменных bash. Например:

wget -O picture.gif ССЫЛКА
IMG=`wget -O- ССЫЛКА | xxd -p`
echo -ne "$IMG" | xxd -p -r | cmp ./picture.gif

Ага, ubuntufan, в этом было дело.
Спасибо огромное!
« Последнее редактирование: 07 Сентября 2014, 16:31:23 от Dexel »

 

Страница сгенерирована за 0.038 секунд. Запросов: 25.