Этот вопрос был там некоторое время, и я подумал, что должен предложить несколько бонусных баллов, если я смогу заставить его работать.
Что я сделал…
Недавно на работе написал парсер, который конвертировал бы бинарный файл в читабельный формат. Двоичный файл не является файлом 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 |[email protected]...|
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 и графическим интерфейсом.
Теперь часть вопроса
Я хочу сделать обратное тому, что я сделал. Это был мой план -
- Иметь легко читаемый текстовый файл ввода, который будет иметь
Parameters : Values
. - Пользователь может просто поместить значения рядом с ними (например, дата будет параметром, и пользователь может указать дату, которую он хочет, чтобы файл данных имел).
- Сценарий вырежет всю соответствующую информацию (информацию, предоставленную пользователем) из входного текстового файла и преобразует ее в шестнадцатеричные значения.
- После того, как файл был преобразован в шестнадцатеричные значения, я хочу закодировать его обратно в двоичный код.
Первые три шага выполнены
Проблема
Как только мой скрипт преобразует входной текстовый файл в текстовый файл с шестнадцатеричными значениями, я получаю файл, подобный следующему (обратите внимание, что я могу сделать с ним 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 баллов ждут того, кто сможет направить меня в правильном направлении. :)
Примеры файлов
Вот образец исходного бинарного файла.
Вот пример текстового файла ввода, который позволит пользователю вводить значения
Вот пример файла, который мой сценарий создает после завершения преобразования из входного текстового файла.
Как изменить кодировку File 3
на File 1
?
cut
из моей команды, оставшийся сценарийawk
возьмет содержимое «Файла» и создаст двоичный вывод, содержащий точное преобразование пар шестнадцатеричных цифр в соответствующие байты в диапазоне 0x00..0xFF. - person Jonathan Leffler   schedule 27.11.2011