テキストに対する Perl のような、バイナリに対する言語とは何でしょうか?

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

質問

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

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

助言がありますか?

役に立ちましたか?

解決

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

直感に反するように思えるかもしれませんが、私は次のことを発見しました。 アーラン これには非常に適しています。つまり、 パターンマッチング, 、バイトやビットであっても(「」と呼ばれます)アーランビットの構文")。これにより、バイトレベル、さらにはビットレベルでのデータの検査と操作を扱う非常に高度なプログラムも非常に簡単に作成できます。

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

そして引用すると インフォームIT.com:

(アーラン)パターンマッチングは本当に取得し始めます バイナリと組み合わせると楽しい 種類。次のようなアプリケーションを考えてみましょう。 ネットワークからパケットを受信し、 次に、それらを処理します。の 4 バイト パケットは、ネットワークのバイトオーダーである可能性があります パケット・タイプ ID。Erlangでは、 必要なのは 1 つの processPacket だけです 関数を 内部のデータ構造 加工。それは何かに見えるでしょう このように:

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

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

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

概要については、を参照してください。 Erlang のビットレベル バイナリと一般化された内包表記次のヒントも確認してください。

他のヒント

パールの パック そして 開梱する ?

Pythonのビット列のモジュールは、この目的のために書かれました。それはあなたがバイナリデータのarbitaryスライスを取ることができますし、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

異なるエンディアンと同様にエンディアンとはるかに交換する能力を持つビューもあります - <のhref =「http://packages.python.org/bitstring/」のrel = "nofollowをnoreferrerを見てみましょう「>手動を。

pythonのビット列のを見てみましょう、それが見えます正確に何をしたいのように:)

私はバイナリファイルにバイナリファイルを表示するには、すべての時間を表示する 010エディタを使用しています。 特に、バイナリファイルで動作するように連動しています。

これは、バイナリファイルを解析し、(ツリー、色で符号化されたフィールドは、そのようなもののような)非常に読みやすい方法でそれらを提示するCのようなスクリプト言語を使用して簡単に持っています... zipファイルとbmpfilesを解析するためにいくつかのサンプルスクリプトがあります。

私は、バイナリファイル形式を作成するたびに、私は常にファイルを閲覧するには010エディタのための小さなスクリプトを作ります。あなたには、いくつかの構造体といくつかのヘッダファイルを持っていれば、バイナリファイルのためのリーダーを作ることは、ほんの数分です。

パック/アンパック機能を備えた任意の高レベルのプログラミング言語が行います。すべての3のPerl、PythonとRubyはそれを行うことができます。それは個人の好みの問題です。私は、これらの各バイナリ解析のビットを書き、Rubyは、このタスクのための最も簡単な/最もエレガントなと感じました。

なぜCインタプリタを使わないのでしょうか?私はいつもスニペットを使って実験するためにそれらを使用していますが、それほど苦労せずに記述するようにスクリプトの何かに1を使用することができます。

私はいつも EIC を気に入っています。それは死んでいたが、プロジェクトは最近復活してきました。 EICは驚くほど有能で合理的に速いです。 CINT のもあります。私はCINTは、Windows上でCygwinを必要だと思いますけれども、両方のは、異なるプラットフォーム用にコンパイルすることができます。

Python の標準ライブラリには、必要なものの一部が含まれています。 配列 特にモジュールを使用すると、バイナリ ファイルの一部の読み取り、エンディアンのスワップなどを簡単に行うことができます。の 構造体 モジュールを使用すると、バイナリ文字列をより詳細に解釈できます。ただし、どちらも必要なほど豊富ではありません。たとえば、同じデータをバイトまたはハーフワードとして表現するには、それを 2 つの配列 ( しこり サードパーティのアドオンは、メモリの同じ領域をいくつかの異なる方法で解釈する場合にはるかに強力です)。また、たとえば、いくつかのバイトを 16 進数で表示するには、次のような単純なループやリストの理解以外に、それほど「バンドル」されたものはありません。 [hex(b) for b in thebytes[start:stop]]. 。このようなタスクをさらに容易にする再利用可能なサードパーティ モジュールがあるのではないかと思いますが、どれか 1 つを紹介することはできません...

フォースもこれでかなり良いが、それは少し難解だことができます。

0と1 - 速度は考慮せず、あなたはperlのたい場合は、

さて、その後、文字のラインにバイナリの各行を翻訳します。はい、私は改行がバイナリ:)ではありません知っているが、おそらくあなたは、いくつかの固定サイズを持っている - 例えばバイトまたはバイナリブロブを破ることが可能ないくつかの他のユニットによるます。

それからちょうどそのデータにperlの文字列処理を使用します)。

あなたはバイナリレベルの処理をやっている場合は、

、それは非常に低いレベルであり、おそらく非常に効率的でかつ最小限の依存関係を持っている/要件をインストールする必要があります。

うまくバイトを扱う - -

だから私はCとなるだろう。そして、あなたはおそらくバイトを扱ういくつかのライブラリパッケージのためのgoogleすることができます。

Erlangのようなものと一緒に行くには、非効率性、依存関係、およびあなたはおそらく低レベルのライブラリとしたくない他の荷物を紹介します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top