16

Perl がテキスト ファイルを非常にスムーズに操作できるように、ファイル内のバイナリ データ (コア ダンプなど) を簡単に分析および操作するためのスクリプト (または高レベルのプログラミング) 言語 (または Python または同様の言語のモジュール) を探しています。

私がやりたいことには、データの任意のチャンクをさまざまな形式 (2 進数、10 進数、16 進数) で提示すること、データをあるエンディアンから別のエンディアンに変換することなどが含まれます。つまり、通常は C やアセンブリを使用するものですが、私は非常に具体的で 1 回限りの目的のための小さなコードを非常に迅速に記述できる言語を探しています。

助言がありますか?

4

11 に答える 11

29

私がやりたいことには、データの任意のチャンクをさまざまな形式 (2 進数、10 進数、16 進数) で提示すること、データをあるエンディアンから別のエンディアンに変換することなどが含まれます。つまり、通常は C やアセンブリを使用するものですが、私は非常に具体的で 1 回限りの目的のための小さなコードを非常に迅速に記述できる言語を探しています。

直観に反するように思えるかもしれませんが、erlangはこれに非常に適していることがわかりました。つまり、バイトとビット (「Erlang Bit Syntax 」と呼ばれる) のパターン マッチングを強力にサポートしているためです。これにより、バイトレベル、さらにはビットレベルでのデータの検査と操作を扱う非常に高度なプログラムでさえ、非常に簡単に作成できます。

2001 年以降、関数型言語の Erlang には、バイト指向のデータ型 (バイナリと呼ばれる) と、バイナリでパターン マッチングを行うための構造が付属しています。

そして、informIT.comを引用します。

(Erlang) パターン マッチングは、バイナリ型と組み合わせると本当に楽しくなります。ネットワークからパケットを受信して​​処理するアプリケーションを考えてみましょう。パケット内の 4 バイトは、ネットワーク バイト順のパケット タイプ識別子である場合があります。Erlang では、これを内部処理用のデータ構造に変換できる単一の processPacket 関数が必要です。次のようになります。

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

したがって、パターン マッチングの組み込みサポートを備えた erlang は関数型言語であるため、非常に表現力豊かです。たとえば、erlang での ueencode の実装を参照してください。

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

概要については、Erlang の Bitlevel Binaries and Generalized Comprehensions を参照してください。また、次のポインターのいくつかを確認することもできます。

于 2009-06-14T19:09:23.420 に答える
6

perlのパックアンパック?

于 2009-06-14T18:38:44.117 に答える
4

python bitstringを見てください。まさにあなたが望むもののように見えます:)

于 2009-06-15T05:00:40.980 に答える
3

010 Editorを使ってバイナリファイルを閲覧する 常時バイナリファイルを閲覧しています。特に、バイナリ ファイルの操作に適しています。

使いやすい C ライクなスクリプト言語を使用して、バイナリ ファイルを解析し、非常に読みやすい方法で表示します (ツリー、色でコード化されたフィールドなど)。zip ファイルと bmp ファイルを解析するスクリプトの例がいくつかあります。

バイナリ ファイル形式を作成するときは常に、010 エディターでファイルを表示するための小さなスクリプトを作成します。いくつかの構造体を含むヘッダー ファイルがあれば、バイナリ ファイルのリーダーを作成するのはほんの数分です。

于 2009-06-14T19:01:59.350 に答える
2

パック/アンパック機能を備えた高レベルのプログラミング言語で十分です。Perl、Python、Ruby の 3 つすべてで実行できます。それは個人的な好みの問題です。これらのそれぞれに少しバイナリ解析を書きましたが、Ruby がこのタスクにとって最も簡単でエレガントであると感じました。

于 2009-06-14T19:00:42.380 に答える
2

Cインタープリターを使用しないのはなぜですか? 私はいつもスニペットを試すためにそれらを使用していましたが、あなたが説明したようなスクリプトを作成するために1つを使用しても、あまり問題はありませんでした.

私はずっとEiCが好きでした。死んでいましたが、プロジェクトは最近復活しました。EiC は驚くほど有能で、適度に高速です。CINTもあります。どちらも異なるプラットフォーム用にコンパイルできますが、Windows では CINT には Cygwin が必要だと思います。

于 2009-06-14T19:00:47.213 に答える
2

Python の標準ライブラリには、必要なものがいくつかあります。特に、配列モジュールを使用すると、バイナリ ファイルの一部を簡単に読み取ったり、エンディアンを交換したりできます。structモジュールを使用すると、バイナリ文字列をより細かく解釈できます。ただし、どちらも必要なほど豊富ではありません。たとえば、同じデータをバイトまたはハーフワードとして表示するには、2 つの配列間でコピーする必要があります ( numpyのサードパーティ製アドオンは、同じ領域を解釈するのにはるかに強力です)たとえば、いくつかのバイトを 16 進数で表示するには、単純なループまたは[hex(b) for b in thebytes[start:stop]]. このようなタスクをさらに容易にする再利用可能なサードパーティ製モジュールがあると思いますが、それを示すことはできません...

于 2009-06-14T19:01:40.833 に答える
1

速度が考慮されず、perl が必要な場合は、バイナリの各行を 0 と 1 の文字の行に変換します。はい、バイナリに改行がないことは知っています:)しかし、おそらく、バイナリブロブを分割できるバイトまたはその他の単位など、固定サイズがあると思われます。

次に、そのデータに対して perl 文字列処理を使用します :)

于 2009-06-15T12:39:51.343 に答える
0

バイナリレベルの処理を行っている場合、それは非常に低レベルであり、非常に効率的で、依存関係/インストール要件が最小限である必要があります。

したがって、私はCを使用します-バイトを適切に処理します-おそらく、バイトを処理するいくつかのライブラリパッケージをグーグルで検索できます。

Erlang のようなものを使用すると、非効率性、依存関係、および低レベルのライブラリではおそらく望ましくないその他の荷物が発生します。

于 2009-06-14T19:23:10.860 に答える