Какой язык является двоичным, поскольку Perl - это текст?

Я ищу язык программирования сценариев (или более высокого уровня) (или, например, модули для Python или аналогичных языков) для простого анализа и обработки двоичных данных в файлах (например, дампов ядра), так же, как Perl позволяет очень плавно манипулировать текстовыми файлами.

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

Любые предложения?

Ответы

Ответ 1

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

Хорошо, хотя это может показаться противоречивым, я нашел erlang, чрезвычайно подходящий для этого, а именно благодаря его мощным поддержка соответствие шаблону, даже для байтов и бит (называется Erlang Бит-синтаксис "). Это очень упрощает создание даже очень продвинутых программ, которые занимаются проверкой и управлением данными на байтах и ​​даже на уровне бит:

С 2001 года функциональный язык Erlang поставляется с байтовым ориентированным типом данных (называемым двоичным) и с конструкциями для сопоставления шаблонов в двоичном формате.

И чтобы процитировать informIT.com:

(Erlang) Совпадение шаблонов действительно начинает весело в сочетании с двоичным тип. Рассмотрите приложение, которое принимает пакеты из сети и затем обрабатывает их. Четыре байта в пакет может быть сетевым байтовым порядком идентификатор пакета. В Эрланге вы просто нужен только один пакет процесса функции, которые могли бы преобразовать это в структура данных для внутренних обработка. Это будет выглядеть например:

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 >>.

Для ознакомления см. Binaryvel Binaries и обобщенные понимания в Erlang. Вы также можете проверить некоторые из следующих указателей:

Ответ 3

Взгляните на python bitstring, он выглядит точно так, как вы хотите:)

Ответ 4

Для этой цели был написан модуль Python bitstring. Он позволяет вам принимать двоичные фрагменты двоичных данных и предлагает множество различных интерпретаций через свойства 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

Существуют также представления с разными понятиями, а также возможность обмениваться контентом и многое другое. Посмотрите на руководство.

Ответ 5

Я использую Редактор 010 для просмотра двоичных файлов все время для просмотра двоичных файлов. Он особенно приспособлен для работы с двоичными файлами.

Он имеет простой в использовании язык сценариев c-like для разбора двоичных файлов и представления их очень читаемым способом (как дерево, поля, закодированные цветом, такие вещи). Есть несколько примеров сценариев для разбора zip файлов и bmp файлов.

Всякий раз, когда я создаю формат двоичного файла, я всегда делаю немного script для редактора 010 для просмотра файлов. Если у вас есть заголовочные файлы с некоторыми структурами, сделать чтение для двоичных файлов за считанные минуты.

Ответ 6

Будет выполняться любой высокоуровневый язык программирования с функциями pack/unpack. Все 3 Perl, Python и Ruby могут это сделать. Это вопрос личных предпочтений. Я написал немного бинарного анализа в каждом из них и почувствовал, что Ruby был самым простым/изящным для этой задачи.

Ответ 7

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

Мне всегда нравилось EiC. Он был мертв, но проект был воскрешен в последнее время. EiC на удивление способна и достаточно быстро. Существует также CINT. Оба могут быть скомпилированы для разных платформ, хотя я думаю, что CINT требует Cygwin для окон.

Ответ 8

Стандартная библиотека Python имеет некоторые из необходимых вам функций - модуль array, в частности, позволяет легко читать части двоичных файлов, swap endianness и т.д.; модуль struct допускает более тонкую интерпретацию двоичных строк. Однако ни один из них не настолько богат, как вам требуется: например, для представления тех же данных, что и байты или полусловы, вам нужно скопировать его между двумя массивами (numpy стороннее дополнение намного более мощно для интерпретации одной и той же области памяти несколькими различными способами), и, например, чтобы отобразить несколько байтов в шестнадцатеричном виде, ничего сложного в "комплекте" за пределами простого петли или списка, например [hex(b) for b in thebytes[start:stop]]. Я подозреваю, что есть многоразовые сторонние модули для облегчения таких задач, но я не могу указать вам на один...

Ответ 9

Forth также может быть довольно хорош в этом, но он немного тайный.

Ответ 10

Ну, если скорость не является соображением, а вы хотите perl, то переведите каждую строку двоичного кода в строку символов - 0 и 1. Да, я знаю, что в двоичных файлах нет фидерных строк:), но предположительно у вас есть фиксированный размер - например, байтом или каким-либо другим устройством, с помощью которого вы можете разбить двоичный блок.

Затем просто используйте обработку строки perl для этих данных:)

Ответ 11

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

Итак, я бы пошел с C - отлично справляется с байтами - и вы, вероятно, можете google для некоторых пакетов библиотек, которые обрабатывают байты.

Идя с чем-то вроде Erlang, вводит неэффективность, зависимость и другой багаж, который, вероятно, вам не нужен с низкоуровневой библиотекой.