web-dev-qa-db-ja.com

ファイルの終わりにある0x00バイトを削除します

FTK Imager Lite を使用して、Linux SDカードからいくつかのファイル(Python、シェルスクリプトなど、テキストファイルのみ)をレスキューしました。ファイルは問題ありませんが、最後に0x00バイトがたくさん含まれています。

これらの末尾の0x00バイトをWindowsマシンで一括削除するにはどうすればよいですか?

私はforコマンドに精通しているので、1つのファイルに対してそれを行う方法についての提案で十分です。その後、すべてのファイルに適用できます。

2
Thomas Weller

MOREコマンドを使用して、各\ 0x00を\ 0x0D\0x0Aに変換できます。

more yourFile.ext >yourFile.ext.new
move /y yourFile.ext.new yourFile.ext >nul

警告:

  • 各ファイルの行数は最大64k行未満である必要があります。そうでない場合、コマンドはハングします(プロンプトを挿入し、64k行の後にキーが押されるのを待ちます)
  • タブはスペースの文字列に変換されます

より堅牢な代替手段は、 JREPL.BAT -Windows用の正規表現テキスト処理コマンドラインユーティリティを使用することです。これは、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプト(JScript /バッチ)です。サードパーティのexeファイルは必要ありません。

ファイルが大きすぎない(1GBに近い?)限り、/ Mオプションを使用してファイル全体をメモリに読み込み、1つの大きな文字列に対して検索/置換操作を実行できます。

jrepl \x00 "" /m /f yourFile.ext /o -

大きなファイルの場合、ファイルを1行ずつ処理できますが、ヌルバイトでは入力に文字セットを指定する必要があるため、ADOを強制的に使用します。標準のJScriptファイル入力ルーチンは、nullバイトを含む行でチョークします。 ADOはその問題を解決します。1バイトの文字セットである限り、どの文字セットを選択してもかまいません。

jrepl \x00 "" /f "yourFile.ext|windows-1252" /o -

完全なドキュメントはJREPL.BATに組み込まれており、ページングされたヘルプについてはjrepl /?またはjrepl /??から入手できます。すべてのオプションの概要はjrepl /?optionsから入手でき、すべてのヘルプオプションの説明はjrepl /?helpから入手できます。

JREPL.BATは、この1つのタスクのための多くのコードです。このタスクのために非常に小さな専用のJScriptまたはVBSスクリプトを作成するのは難しいことではありません。しかし、JREPLを兵器庫に入れると、多くの用途が見つかる可能性があります。これは強力なツールです。

2
dbenham

PowerShellソリューションのコアは次のようになります。

$file = "C:\Users\keith\SomeFile.txt"

$Bytes = [IO.File]::ReadAllBytes($file)

$i = $Bytes.Length - 1

While ($Bytes[$i] -eq 0) { $i-- }

$Bytes = $Bytes[0..$i]

[IO.File]::writeAllBytes($file, $bytes)
1
Keith Miller