Создание двоичных файлов в UNIX

Этот вопрос был некоторое время, и я подумал, что должен предложить несколько бонусных баллов, если я смогу заставить его работать .

Что я сделал…

Недавно на работе я написал синтаксический анализатор, который преобразовывал двоичный файл в читаемый формат. Двоичный файл не является файлом Ascii с 10101010 символами. Он был закодирован в двоичном формате. Итак, если я использую cat для файла, я получаю следующее -

[jaypal~/Temp/GTP]$ cat T20111017153052.NEW 
==?sGTP?ղ?N????W????&Xx1?T?&Xx1?;
?d@#e?
      ?0H????????|?X?@@(?ղ??VtPOC01
cceE??k@9??W傇??R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!

??!

??#ripassword??W傅?W傆??0H??
                            #R??@Vtc@@(?ղ??n?POC01

Итак, я использовал утилиту hexdump , чтобы файл отображался в соответствии с содержимым и перенаправил его в файл. Теперь у меня был выходной файл, который представлял собой текстовый файл, содержащий шестнадцатеричные значения.

[jaypal~/Temp/GTP]$ hexdump -C T20111017153052.NEW 
00000000  3d 3d 01 f8 73 47 54 50  02 f1 d5 b2 be 4e e4 d7  |==..sGTP.....N..|
00000010  00 01 01 00 01 80 00 cc  57 e5 82 00 00 00 00 00  |........W.......|
00000020  00 00 00 00 00 00 00 00  87 d3 f5 13 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 01 00 10  |................|
00000040  01 01 0f 00 00 00 00 00  26 58 78 31 00 b3 54 c5  |........&Xx1..T.|
00000050  26 58 78 31 00 b4 3b 0a  00 00 ad 64 13 40 01 03  |&Xx1..;....d.@..|
00000060  23 16 65 f3 01 01 0b 91  30 19 48 99 f2 ff ff ff  |#.e.....0.H.....|
00000070  ff ff ff 02 00 7c 00 dc  01 58 00 a0 40 40 28 02  |.....|...X..@@(.|
00000080  f1 d5 b2 b8 ca 56 74 50  4f 43 30 31 00 00 00 00  |.....VtPOC01....|
00000090  00 04 0a 63 63 07 00 00  00 00 00 00 00 00 00 00  |...cc...........|
000000a0  00 00 00 65 45 00 00 b4  fb 6b 40 00 39 11 16 cd  |...eE....k@.9...|
000000b0  cc 57 e5 82 87 d3 f5 52  85 a1 08 4b 00 a0 69 02  |.W.....R...K..i.|
000000c0  32 10 00 90 00 00 00 00  ad 64 00 00 02 13 40 01  |2........d....@.|

После тонны awk , sed и cut скрипт преобразовал шестнадцатеричные значения в читаемый текст. Для этого я использовал позиционирование смещения, которое отмечало бы начало и конец каждого преобразованного параметра. Результирующий файл после всех преобразований выглядит так

[jaypal:~/Temp/GTP] cat textfile.txt 
Beginning of DB Package Identifier: ==
Total Package Length: 508
Offset to Data Record Count field: 115
Data Source: GTP
Timestamp: 2011-10-25
Matching Site Processor ID: 1
DB Package format version: 1
DB Package Resolution Type: 0
DB Package Resolution Value: 1
DB Package Resolution Cause Value: 128
Transport Protocol: 0
SGSN IP Address: 220.206.129.47
GGSN IP Address: 202.4.210.51

Почему я это сделал

Я инженер-тестировщик, и проверять бинарные файлы вручную было большой проблемой. Мне пришлось вручную проанализировать смещения и использовать калькулятор для их преобразования и проверки на соответствие Wireshark и графическому интерфейсу.

Теперь вопрос, часть

Я хочу сделать обратное тому, что я сделал. Это был мой план -

  • Создать легко читаемый текстовый файл ввода, который будет иметь Параметры: Значения .
  • Пользователь может просто поместить значения рядом с ними (например, Дата будет параметром, и пользователь может указать дату, которую он хочет иметь в файле данных).
  • Сценарий вырежет всю соответствующую информацию (информацию, предоставленную пользователем) из входного текстового файла и преобразует ее в шестнадцатеричные значения.
  • После того, как файл был преобразован в шестнадцатеричные значения, я хочу снова закодировать его в двоичном формате.

Первые три шага выполнены

Проблема

Как только мой сценарий преобразует входной текстовый файл в текстовый файл с шестнадцатеричными значениями, я получаю файл следующего вида ( обратите внимание, что я могу сделать cat на нем ).

[visdba@hw-diam-test01 ParserDump]$ cat temp_file | sed 's/.\{32\}/&\n/g' | sed 's/../& /g'
3d 3d 01 fc 73 47 54 50 02 f1 d6 55 3c 9f 49 9c
00 01 01 00 01 80 00 dc ce 81 2f 00 00 00 00 00
00 00 00 00 00 00 00 00 ca 04 d2 33 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
01 01 0f 00 00 07 04 ea 00 00 ff ff 00 00 14 b7
00 00 ff ff 00 00 83 ec 00 00 83 62 54 14 59 00
60 38 34 f5 01 01 0b 58 62 70 11 60 f6 ff ff ff
ff ff ff 02 00 7c 00 d0 01 4c 00 b0 40 40 28 02
f1 d6 55 38 cb 2b 23 50 4f 43 30 31 00 00 00 00
00 04 0a 63 63 07 00 00 00 00 00 00 00 00 00 00

Я намерен закодировать этот преобразованный файл в двоичный , чтобы, когда я вводил cat в файл, я получал кучу мусорных значений.

[jaypal~/Temp/GTP]$ cat temp.file 
==?sGTP?ղ?N????W????&Xx1?T?&Xx1?;
?d@#e?
      ?0H????????|?X?@@(?ղ??VtPOC01
cceE??k@9??W傇??R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!

??!

Итак, вопрос в следующем. Как мне закодировать его в этой форме?

Почему я хочу это сделать?

У нас не так много сообщений GTP (протокол туннелирования GPRS) на производстве. Я подумал, что если я перепроектирую это, я смогу эффективно создать генератор данных и делать свои собственные данные.

Подведем итоги

Могут существовать сложные инструменты, но я не хочу тратить слишком много времени на их изучение. Прошло около 2 месяцев, я начал работать над платформой * nix и просто возился с ее мощными инструментами, такими как sed и awk .

Что мне действительно нужно, так это некоторая помощь и руководство, чтобы это произошло.

Еще раз спасибо за чтение! 200 баллов ждут того, кто направит меня в правильном направлении.:)

Образцы файлов

Вот образец исходного двоичного файла

Вот образец входного текстового файла , который позволяет пользователю вводить значения

Вот образец файла , который мой сценарий создает после завершения преобразования из входного текстового файла.

Как изменить кодировку файла 3 на файла 1 ?

9
задан jaypal singh 28 November 2011 в 21:01
поделиться