вторник, 17 мая 2016 г.

hex dump


Постоянные пользователи Vim наверняка слышали об утилите xxd. Она позволяет вывести дамп указанного файла. Выглядит это следующим образом:
$ xxd -l 64 db.sqlite3 
0000000: 5351 4c69 7465 2066 6f72 6d61 7420 3300  SQLite format 3.
0000010: 0400 0101 0040 2020 0000 0013 0000 0024  .....@  .......$
0000020: 0000 0000 0000 0000 0000 0017 0000 0004  ................
0000030: 0000 0000 0000 0000 0000 0001 0000 0000  ................
Параметр -l 64 указывает, что нужно вывести только первые 64 байта. Есть еще один любопытный параметр (-i), который позволяет сгенерировать код, и его можно сразу вставлять в C или C++ файл:
$ xxd -i -l 64 db.sqlite3
unsigned char db_sqlite3[] = {
  0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61,
  0x74, 0x20, 0x33, 0x00, 0x04, 0x00, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
  0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x04,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  0x00, 0x00, 0x00, 0x00
};
unsigned int db_sqlite3_len = 64;
Параметров для генерации кода для других языков не предусмотрено. Но это поправимо. Например, мне понадобилось вставить код в модульные тесты на Python 3. Помог в этом потоковый редактор sed:
$ xxd -l 64 -g 1 -u db.sqlite3 | sed -e 's/.\+: /b"\\x/g' -e 's/  .*/"/g' -e 's/ /\\x/g'
b"\x53\x51\x4C\x69\x74\x65\x20\x66\x6F\x72\x6D\x61\x74\x20\x33\x00"
b"\x04\x00\x01\x01\x00\x40\x20\x20\x00\x00\x00\x13\x00\x00\x00\x24"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x04"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
И кстати, вскоре я поделюсь опытом как быстро начать писать программы на Python.


Книги по теме:
  1. Дню Нейл. Практическое использование Vim
  2. Марк Лутц. Программирование на Python. Том 1

Комментировать в ВКонтакте