バイナリデータで標準の入出力を使用しても安全ですか?


14

バイナリファイルを2つに分割する必要があります。私は頭や尾を使用できるかどうか疑問に思っていましたが、その後疑問に思いました...リダイレクト、パイピングなどをバイナリデータで使用しても安全ですか?新しい行が台無しになったり、nullが無視されたり、バックスペースや削除が何か特別なことをしますか?(bash、kubuntu 18.04 LTS)


1
splitコマンドを見てください。
エグモント

回答:


19

はい、別のプロセスにパイプするか、ファイルに保存しても安全です。バイナリstdoutをターミナルに出力すると、ターミナルディスプレイを一時的に混乱させるエスケープシーケンス(ランダム)が含まれる可能性があるため、潜在的な「奇妙さ」があります。


6
その場合はreset、入力してEnter キーを押すと修正できます。
バールドコッペルード

4
@BaardKopperud tset / resetが機能しないコーナーケースについてどこかで読んだと思った
Xen2050

1
@ Xen2050知りません。何らかのエスケープシーケンスがキーボードレイアウト/エンコーディングを変更した場合に発生する唯一のケースです。そのため、入力reset<enter> は実際には端末から見た文字のシーケンスを入力しません...
Bakuriu

3
バイナリファイル表示した後のターミナルの修正およびCTRL + Cの後にコンソールをリセットすることが必要な理由も参照してください。最初のリンクで提案されているように、stty sane; tput rs1一連のコマンドは、機能しないという特殊なケースがある場合にreset役立ちます。このようなケースには、Bakuriuによる言及に加えて、端末の行/列の幅が含まれるか、シリアル通信に関連する設定(ボーレート/パリティ)が推測されます。
セルギーコロディアズニー

1

headまたはなどのコマンドを使用する場合の主な問題tailは、それらが行指向であり、バイナリファイルがそうではないことです。改行が含まれている場合は、行の終わりを表すために使用されないことが多く、含まれている場合は、プログラムメッセージやデータフィールドなどの文字列の一部である可能性があります。

データが何らかの方法で構造化されている場合、分割点を選択する際にそれを考慮に入れて、途中で構造を壊さないようにする必要があります。

ファイルの構造がわかっている場合は、次のようなコマンドを使用できます

dd -if input-file -of output-file ...

特定の(増分された)オフセットから始まる特定のサイズの非常に多くのデータブロックのみをファイルにコピーするオプションがあります。

split@egmontで述べたコマンドがこのプロセスを自動化するように見えますが、デフォルトでは行指向のように見えるため--bytes count、ファイルの各部分の大きさを伝えるなどの追加オプションを指定する必要がありますである。


補足として、ファイルの内容がわからないが、少なくともいくつかの意味のあるテキストデータが含まれていると思われる場合、このstringsコマンドは最初に見て、何を扱っているかを確認するのに最適な方法です。

strings -n 6 file | less

少なくとも6文字の長さの印刷可能文字のすべての実行を検出し、それらがページャーで表示されるので、端末上を飛び回ることはありません。デフォルトの4文字よりも少し大きい数を使用すると、たまたま印刷可能になったがファイルではそのように使用されていないデータの小さな断片を排除するのに役立ちます。

後でなどのバイナリエディタでファイルをさらに詳しく調べるhexedit必要がある場合は、興味深いものが見つかる可能性のある場所を示すいくつかのランドマークがあります。

stringsオプションがあります- t x これは、印刷された各文字列の前にファイルへのオフセットを16進数(8進数の場合はo、10進数の場合はd)で表示します。非常に短いファイルであっても、文字ごとに見なければならない場合には対処する必要があります。

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