Какой язык относится к двоичному, как Perl относится к текстовому?
-
13-09-2019 - |
Вопрос
Я ищу язык написания сценариев (или программирования более высокого уровня) (или, например,модули для Python или аналогичных языков) для легкого анализа двоичных данных в файлах и манипулирования ими (например,core dumps), так же как и Perl, позволяет очень плавно манипулировать текстовыми файлами.
Вещи, которые я хочу сделать, включают представление произвольных фрагментов данных в различных формах (двоичной, десятичной, шестнадцатеричной), преобразование данных из одного конечного значения в другое и т.д.То есть то, для чего вы обычно используете C или assembly, но я ищу язык, который позволяет очень быстро писать крошечные фрагменты кода для узкоспециализированных одноразовых целей.
Есть какие-нибудь предложения?
Решение
Вещи, которые я хочу сделать, включают представление произвольных фрагментов данных в различных формах (двоичной, десятичной, шестнадцатеричной), преобразование данных из одного конечного значения в другое и т.д.То есть то, для чего вы обычно используете C или assembly, но я ищу язык, который позволяет очень быстро писать крошечные фрагменты кода для узкоспециализированных одноразовых целей.
Что ж, хотя это может показаться нелогичным, я нашел эрланг чрезвычайно хорошо подходит для этого, а именно благодаря своей мощной поддержке соответствие шаблону, даже для байтов и битов (называемых "Битовый синтаксис Erlang").Это позволяет очень легко создавать даже очень продвинутые программы, которые занимаются проверкой и манипулированием данными на байтовом и даже битовом уровне:
С 2001 года функциональный язык Erlang поставляется с байтово-ориентированным типом данных (называемым двоичным) и конструкциями для сопоставления с шаблоном в двоичном файле.
И процитировать informIT.com:
(Erlang) Сопоставление шаблонов действительно начинает доставлять удовольствие в сочетании с двоичным типом.Рассмотрим приложение, которое получает пакеты из сети и затем обрабатывает их.Четыре байта в пакете могут быть сетевым порядком байтов идентификатор типа пакета.В Erlang вам понадобился бы просто один processPacket функция, которая могла бы преобразовать это в структуру данных для внутренней обработки.Это выглядело бы примерно вот так:
processPacket(<<1:32/big,RestOfPacket>>) ->
% Process type one packets
...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
% Process type two packets
...
Итак, erlang с его встроенной поддержкой сопоставления с образцом и тем, что он является функциональным языком, довольно выразителен, см., Например, реализацию ueencode в erlang:
uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.
Введение см. в разделе Двоичные файлы на уровне битов и обобщенные представления в Erlang. Возможно, вы также захотите ознакомиться с некоторыми из следующих указателей:
- Парсинг двоичных файлов с помощью erlang, ламеры внутри
- Дополнительная обработка файлов с помощью Erlang
- Одновременное изучение формата Erlang и Adobe Flash
- Большие двоичные данные - это (не) слабость Erlang
- Эффективное программирование с помощью двоичных файлов и битовых строк
- Битовый синтаксис Erlang и сетевое программирование
- эрланг, язык сетевого программирования (1)
- Эрланг, язык сетевого программирования, Выпуск 2:сопоставление двоичных шаблонов
- Устройство для чтения / записи MIDI-файлов Erlang
- Битовый синтаксис Erlang
- Понимание конечности
- Играю с Эрлангом
- Эрланг:Объявления о сопоставлении шаблонов с операторами Case / Другое
- Потоковая библиотека, использующая двоичные файлы Erlang
- Двоичные файлы битового уровня и обобщенные представления в Erlang
- Приложения, реализация и оценка производительности программирования битовых потоков в Erlang
Другие советы
перл пакет и распаковать ?
Питон битовая строка Модуль был написан для этой цели.Он позволяет вам брать произвольные фрагменты двоичных данных и предлагает множество различных интерпретаций через свойства Python.Он также предоставляет множество инструментов для создания и изменения двоичных данных.
Например:
>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf') # 16 bits long
>>> print(s.hex, s.bin, s.int) # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001' # slice assignment
>>> s.replace('0b110', '0x345') # find and replace
2 # 2 replacements made
>>> s.prepend([1]) # Add 1 bit to the start
>>> s.byteswap() # Byte reversal
>>> ordinary_string = s.bytes # Back to Python string
Также имеются функции побитового чтения и навигации по битовой строке, как и в файлах;на самом деле это можно сделать прямо из файла, не считывая его в память:
>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001') # Seek to next occurence, if found
True
Также существуют представления с разным порядком байтов, а также возможность менять порядок байтов и многое другое — взгляните на руководство.
Взгляни на битовая строка Python, похоже, это именно то, что вы хотите :)
я использую 010 Редактор для просмотра двоичных файлов все время для просмотра двоичных файлов.Он специально предназначен для работы с двоичными файлами.
Он имеет простой в использовании язык сценариев типа C для анализа двоичных файлов и представления их в очень удобном для чтения виде (в виде дерева, полей, закодированных цветом, и тому подобное).Есть несколько примеров сценариев для анализа zip- и bmp-файлов.
Всякий раз, когда я создаю двоичный формат файла, я всегда создаю небольшой скрипт для редактора 010 для просмотра файлов.Если у вас есть заголовочные файлы с какими-то структурами, создание программы чтения двоичных файлов — это считанные минуты.
Подойдет любой язык программирования высокого уровня с функциями упаковки/распаковки.Все три Perl, Python и Ruby могут это сделать.Это вопрос личных предпочтений.Я написал немного двоичного анализа для каждого из них и почувствовал, что Ruby проще всего/наиболее элегантно подходит для этой задачи.
Почему бы не использовать интерпретатор C?Я всегда использовал их для экспериментов с фрагментами, но вы можете использовать их для написания сценария чего-то подобного, что вы описываете, без особых проблем.
мне всегда нравилось ЭйК.Он был мертв, но недавно проект возродился.EiC на удивление способен и достаточно быстр.А также есть ЦИНТ.Оба могут быть скомпилированы для разных платформ, хотя я думаю, что CINT нужен Cygwin для Windows.
В стандартной библиотеке Python есть кое-что из того, что вам нужно: множество модуль, в частности, позволяет легко читать части двоичных файлов, менять порядок байтов и т. д.;тот структура Модуль позволяет более детально интерпретировать двоичные строки.Однако ни один из них не настолько богат, как вам требуется:например, чтобы представить одни и те же данные в виде байтов или полуслов, вам необходимо скопировать их между двумя массивами ( бестолковый стороннее дополнение гораздо более эффективно для интерпретации одной и той же области памяти несколькими разными способами), и, например, для отображения некоторых байтов в шестнадцатеричном формате нет ничего особенного, кроме простого понимания цикла или списка, такого как [hex(b) for b in thebytes[start:stop]]
.Я подозреваю, что существуют многоразовые сторонние модули для дальнейшего облегчения таких задач, но я не могу указать вам ни на один...
Форт также может неплохо справляться с этой задачей, но это немного загадочно.
Что ж, если скорость не имеет значения, и вам нужен Perl, тогда преобразуйте каждую строку двоичных данных в строку символов - 0 и 1.Да, я знаю, что в двоичном формате нет перевода строки :) но, по-видимому, у вас есть фиксированный размер - например.по байту или какой-либо другой единице измерения, с помощью которой можно разбить двоичный объект.
Затем просто используйте обработку строк Perl для этих данных :)
Если вы выполняете обработку на двоичном уровне, это очень низкий уровень и, вероятно, должен быть очень эффективным и иметь минимальные зависимости/требования к установке.
Поэтому я бы выбрал C - хорошо обрабатывает байты - и вы, вероятно, можете поискать в Google некоторые библиотечные пакеты, которые обрабатывают байты.
Использование чего-то вроде Erlang приводит к неэффективности, зависимостям и другому багажу, который вам, вероятно, не нужен при работе с низкоуровневой библиотекой.