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

StackOverflow https://stackoverflow.com/questions/993434

Вопрос

Я ищу язык написания сценариев (или программирования более высокого уровня) (или, например,модули для 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. Возможно, вы также захотите ознакомиться с некоторыми из следующих указателей:

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top