バイナリ処理のためのシェルのような環境


15

この質問は数回前に私に来ましたが、今では質問/programming/993434/what-language-is-to-binary にあるBash Answersのstdinからのバイナリデータチャンクをループする質問に 答えて-as-perl-is-to-textも満足のいくものではありませんでした。

バイナリファイルでのI / Oの処理に特に適したスクリプト環境を探しています。本格的なプログラミング言語(c / Python / ...)のいずれかを使用できることは知っていますが、それらには膨大な初期化とコーディングのオーバーヘッド(cの割り当てとfread / fwrite、Pythonのビット文字列など)がありますスクリプト(スクリプトから他のアプリケーションを呼び出す)にはあまり適していません。Perlは、そのunpack機能、文字列指向の操作、および間抜けな構文で優れています。

のようなものodですが、言語として。

私が期待するもの:

  1. 単一のスイッチ/コマンドでエンディアンを設定または変更します。
  2. 要求されたタイプの単純な仕様(bash read varint32 varで 拡張するfloat varなど)。
  3. パイプを介したバイナリの処理、指定されたバイト数のスキップ。
  4. 慣れている標準のスクリプトフロー制御(for / if / ...)。

ASCIIファイルを検査するときに得られるのと同じ簡単さと洞察で、生データ(写真、科学データ、未知の、不十分な文書形式)を処理したいと思います。c現在使用していますが、アドホックスクリプトには最適ではなく、インタラクティブにすることはできません。

誰もがそのようなツールを知っていますか?かわいらしいGUIソフトウェアはありません。sshを介して、他のスクリプトなどから動作する必要があります。「存在しません」は受け入れられますが、憂鬱な答えです。


2
起動時間の苦痛を取り除くことはできませんが、Python 3.3のバイトとplumbが非常に有効であることがわかりchain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()ました。
アントン14年

現在使用しているCコードを、bashスクリプトで使用できる一連のコマンドラインツールに変換できます。バイナリをシェル変数に入れることはできませんが、名前付き( 'fifo')パイプに格納することはできます。それらの内容は、読みたくなるまでメモリに保持されます。
goldilocks 14年

1
WRTのpythonとperlの推論に重大な欠陥があります。個々のコマンドラインツールはコンパイルされますが、シェルスクリプトは多くのフォークを必要としません(高価な場合は、フォークが必要です)。あなたの議論や他の質問などは、バイナリを処理できるなら、ここでbashを使用しても大丈夫だと示唆しています。Pythonとperlスクリプトは両方ともプリコンパイルされています。かなり複雑なpythonまたはperlスクリプト対並列bashスクリプトをベンチマークすると、perlまたはpythonは桁違いに高速になります。あなたが私を信じないなら、あなたは反対の証拠のためにウェブを検索することを歓迎します。
goldilocks

高速で実行できるツールを探しているのではなく、高速にコーディングできるものを探しています。たとえば、後に続く構造体(int、float、float)の配列サイズのバイナリintを出力する奇妙なプログラムがある場合、配列サイズをすばやく読み取り、配列をループして、一部のコンポーネントの累積または最大、またはgnuplot処理用のascii列として1つのコンポーネントを印刷します。Anthon:ありがとう、私はこれについて知らなかった、役に立つだろう。goldilocks:私はそれを避けようとしていますが、最後に自分のツールを書くだけかもしれません:)
orion 14年

2
あなたのようなサウンドは、使用する方法についてのチュートリアル必要perlさんunpack(ᵔᴥᵔ)
ステファンChazelas

回答:


2

何年もあなたとまったく同じ問題を抱えています。

単純な非対話型の使用では、バイナリブロックエディターBBEを使用します。BBEはSEDがテキストであるようにバイナリであり、その古風な構文とシンプルさを含みますが、私が必要とする多くの機能が欠けているため、他のツールと組み合わせる必要があります。したがって、BBEは部分的なソリューションにすぎません。また、BBEには何年も更新や改善が行われていないことに注意してください。

もちろん、テキストベースのツールでデータを編集するxxd前後に使用できますxxd -rが、問題のデータが大きく、ブロックデバイスを処理するときなど、ランダムアクセスが必要な場合は機能しません。

(注:Windowsには、少なくとも高価なプロプライエタリなWinHexスクリプト言語がありますが、それではどこにも行きません。)

より複雑なバイナリ編集の場合、大きなファイルには遅すぎることもありますが、通常はPythonにフォールバックします。これが主な欠点です。私は願っていますPyston(最適化されたマシンコードにコンパイルするLLVMを採用Pythonは)いつか使えるように十分に成熟します、またはより良い、誰かが速く、私の知る限りでは存在しない2値化処理スクリプト言語、汎用性の高い、自由コンパクトに設計し、実装しますまだU * IXのようなシステム。

更新

私はたまたま自作のオープンソースIntel x86 アセンブラーフラットアセンブラー、または略してfasm を使用することもあります。

強力な、テキストブロックベースのマクロプリプロセッサ(それ自体がチューリング完全言語)を持ち、borlandターボアセンブラマクロ言語の伝統の構文を備えていますが、はるかに高度です。

また、任意のファイルをバイナリにインクルードし、「コンパイル時」にあらゆる種類のバイナリおよび算術操作(整数のみ)を実行し、結果を出力ファイルに書き込むことができるデータ操作言語があります。このデータ操作言語には制御構造があり、チューリングも完了しています。

Cやおそらくpythonでバイナリ操作を行うプログラムを作成するよりもはるかに使いやすいです。さらに、外部の依存関係をほとんど持たない小さなサイズの実行可能ファイルであるため、非常に高速にロードされます(2つのバージョンがあります:libcのみが必要か、LinuxカーネルABIで直接静的実行可能ファイルとして実行できます)。

以下のようなラフなエッジがあります

  1. 並行性をサポートしていません

  2. 32ビットx86アセンブリ(ただしx86_64で動作します)で作成されているため、x86またはx86_64以外で実行する場合はおそらくqemuまたは同様のエミュレータが必要です。

  3. これは強力なマクロプリプロセッサ言語であるため、Lisp、Haskell、XSLT、またはおそらくM4が最適です。

  4. 出力ファイルに書き込まれるすべてのデータはメモリ内の「フラット」バッファで実行され、このバッファは出力ファイルが書き込まれてfasmが終了するまで拡大できますが縮小できません。つまり、fasmの1回の実行でメインメモリが残っているのと同じ大きさのファイルしか生成できません。

  5. データは、fasmの実行ごとに1つの出力ファイルにのみ書き込むことができます

  6. ええ、それは自家製ですが、本当にきちんとした賢いものです


2

Perlのアンパックで必ずしも「和解」する必要はありません... perlの素晴らしい点の1つは、カスタムパッケージでパーサーとシンボルテーブルを悪用して独自の言語を作成する方法です。

これは基本的にあなたが探しているものですか?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

次に、MyBinLibパッケージを作成するのに十分なperlを学習します。Perlフォーラムで質問すれば、おそらく喜んで助けてくれるでしょう。


1

あなたが遭遇したbeav、それはマクロを持っていますが、私は、スクリプトを見つけることができませんでした

apt-cache show beav 抽出:

beavを使用すると、HEX、ASCII、EBCDIC、OCTAL、DECIMAL、およびBINARYのファイルを編集できます。FLOATモードではデータを表示できますが、編集することはできません。これらのモードのいずれかで検索または検索と置換ができます。データは、BYTE、WORD、またはDOUBLE WORD形式で表示できます。WORDSまたはDOUBLE WORDSを表示している間、データはINTELまたはMOTOROLAのバイト順で表示できます。任意の長さのデータをファイルの任意のポイントに挿入できます。このデータのソースは、キーボード、別のバッファ、またはファイルです。表示されているデータは、表示された形式でプリンターに送信できます。メモリよりも大きいファイルを処理できます。

次にxxd、バイナリ/ ascii表示モードへ/から変換し、sedまたはと組み合わせることのできるものviがありますが、バイトスワップ機能はありません。


0

いつでもゴールドを選び、CまたはASMにドロップダウンできます。生のバイナリで作業している場合は、レジスタから直接バウンスします。あなたは「すでにそこにいます」。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.