GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

odのようなもの 、しかし言語として。

私が期待すること:

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

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

誰かがそのようなツールを知っていますか?クリックの多いGUIソフトウェアは使用しないでください。他のスクリプトなどからsshを処理する必要があります。 「存在しない」は受け入れられますが、気のめいるような答えです。

承認された回答:

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

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

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

(注:Windowsの場合、少なくとも高価な独自のWinHexスクリプト言語がありますが、それではどこにも行き着きません。)

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

関連:子孫を処理しますか?

更新

また、自作のオープンソースのIntel x86アセンブラーフラットアセンブラー、または略してfasmを使用します。これは、単なるアセンブラー以上のものに進化しました。

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

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

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

のようにいくつかのラフエッジがあります
  1. 同時実行をサポートしていません

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

  3. 強力なマクロプリプロセッサ言語が完全に完成しつつあります。これは、Lisp、Haskell、XSLT、またはおそらくM4などの言語の経験が豊富であることを意味します。

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

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

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


Linux
  1. MySQL –InnoDBのテーブルごとのデータへの変換

  2. それを回避する人のためのRAID

  3. Linux –すべてのユーザーにとって永続的な環境変数?

  1. 一時データの疑似ファイル?

  2. ELF バイナリの動的セクションを変更するためのツール

  3. Arch Linux はサーバー環境に適していますか?

  1. グローバルマネージドサービスプロバイダーのGDPRコンプライアンス

  2. 環境変数の確認

  3. シェル スクリプトでバイナリ データを 16 進数に変換する