Windows 7でファイルのバイナリコンテンツをネイティブに表示するにはどうすればよいですか?(出来ますか。)


35

500MBより少し大きいファイルがあり、いくつかの問題を引き起こしています。

この問題は、使用されている行末(EOL)規則にあると思います。未解釈の未加工形式(1)のファイルを見て、ファイルのEOL規則を確認したいと思います。

Windows 7に組み込まれているものを使用して、ファイルの「バイナリ」を表示するにはどうすればよいですか?追加のものをダウンロードする必要はありません。

(1)同僚と私はファイルをテキストエディターで開きましたが、期待どおりに行が表示されます。ただし、両方のテキストエディターは、異なるEOL規則でファイルを開き、自動的に解釈します。(TextEditとEmacs24.2。Emacsの場合head -c4096、Linuxボックスで最初の4Kバイトだけを使用して2つ目のファイルを作成し、それをWindowsボックスから開きました。

Emacsでhexl-modeを使用しようとしましたが、hexl-modeに移動してtext-modeに戻ると、バッファーの内容が変更され、各行の最後に目に見える^ Mが追加されたため、現時点でそれを信頼しています。

この問題は、使用されている行末文字にある可能性があります。私の同僚と私が試した編集者は(1)行末規則を自動的に認識し、行を表示しました。そして、他の証拠に基づいて、私はEOL条約はキャリッジリターンのみであると信じています。(2)返品のみ。

実際にファイルに何が含まれているかを知るために、10進数または8進数で作業できますが、ファイルのバイナリコンテンツ、またはファイルの少なくとも数千バイト、できれば16進数を調べたいと思います。ゼロを1つだけ見るのはかなり荒いでしょう。

更新

を示唆するものを除き、DEBUG以下のすべての答えはある程度機能します。私はそれらのそれぞれを役立っていると投票しました。私の質問は不整形でした。提案された各ソリューションをテストする際に、16進数とテキストコンテンツを並べて表示することを本当に望んでおり、バイト値またはテキスト文字のいずれかの上にカーソルを置いたときに、反対側が強調表示されます。

Emacs hexl-modeが「正しく」動作し始めたときに、実際に問題を解決しました。そのため、これらの回答は使用せず、テストするだけでした(実際には、奇妙なEmacsの動作を調査し、バグレポートを提出する必要があります)。


Cygwinの下には何らかのツールがありそうですが、Cygwinをインストールする必要があります。または、たとえばボックスにJavaがインストールされている場合、Javaで16進ダンププログラムを作成するのは非常に簡単な作業です。
ダニエルRヒックス

回答:


11

「16進エディタ」が必要です。私は長年「Hex Editor Neo」を使用してきましたが、非常に優れています。それはで利用できる無料と有料バージョン。(そして、私は他の同様のツールが利用可能であると確信しています。)


4
追加のプログラムを追加するのが好きではないので、Windows 7以外に何もせずに、1)多くの人が私が許可していない方法でインストールするため、どのように尋ねましたか。2)一部は危険なように見える。それは、Hex Editor Neoが適切な推奨事項であると思われるということです。+1
シャノンセベランス

1
zblist.comは、インストールする必要も特別な権限も必要としないスタンドアロンプ​​ログラムであり、Alt-Hまたは16進数モードがあります
-sgmoore

記載、記載漏れ、記載なしなど、私の要件をすべて満たしました。Hex Editor Neoも高速で、ツールバッグに追加されました。
シャノン退職

1.他のエディターはネイティブではありません。2.ファイルマネージャはこの目的に適していて、移植可能なものがたくさんあります。3.タイプコマンドは、コンテンツをネイティブに表示でき、有用なフィルター(ページごとなど)を備えています。
オーバーマインド

37

PowerShellバージョン5.0以降を使用している場合は、powershell組み込み関数を使用できますFormat-Hex

PS:21 C:\Temp >Format-Hex application.exe

            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

00000000   42 4D 5E 00 00 00 00 00 00 00 36 00 00 00 28 00  BM^.......6...(. 
00000010   00 00 0A 00 00 00 01 00 00 00 01 00 20 00 00 00  ............ ... 
00000020   00 00 00 00 00 00 C4 0E 00 00 C4 0E 00 00 00 00  ......Ä...Ä..... 
00000030   00 00 00 00 00 00 B7 59 71 FF B7 59 71 FF B7 59  ......•Yq.•Yq.•Y 
00000040   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF B7 59  q.•Yq.•Yq.•Yq.•Y 
00000050   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF        q.•Yq.•Yq.•Yq.

4
率直に言って、これが一番の答えではないことに驚いています。これは、Windowsの組み込みツールを使用して行う正しい方法です。出力をファイルに書き込みたい場合は、>フォーマット・ヘックスapplication.exe> out.txtを使用することができます
techdude

これはいいように思えFormat-Hexますが、PowerShellでは使用できません。「認識されない」エラーが表示されます
-Kidburla

JamieSeeによると、powershell 5.0までは追加されなかったようです。
techdude

26

ビルトイン、クイック、ダーティ:start powershell、execute:

gc -encoding byte -TotalCount 100 "your_file_path" |% {write-host ("{0:x}" -f $_) -noNewline " "}; write-host   

TotalCountは、ファイルから読み取るバイト数です。

Googleの「powershell hexdump」を使用して、より洗練された/実行可能なバージョンを取得します。

Windowsリソースキットツール(正確には組み込まれていませんが、閉じている)がある場合は、というcmd lineユーティリティも使用できますlist.exe。16進モードの小さなエディターです。大きなファイルで動作するように特別に設計された:

リストテキストファイルツール(リスト)は、1つ以上のテキストファイルを表示および検索するコマンドラインツールです。他のテキスト表示ツールとは異なり、リストはファイルを開いたときにファイル全体をメモリに読み込みません。ユーザーは、16進形式のテキストファイルを編集できます。

リストは、テキストファイルまたはログファイルをリモートで表示したり、管理者がシステムパフォーマンスの低下を懸念しているサーバーで使用したりする場合に役立ちます。


1
これまでのところ、このソリューションは私が求めていた最も近いものです。
シャノン退職

1
既にインストール済みの、すてきでシンプルなもの。Iは、書き込みホスト(とフォーマットを変更:、「0A」ではない「A」として表示さは0x0Aを強制的に「{0 X2}」2 2桁上ケース用そのための方法のそれのようなI
アダムStraughan

1
List.exeは完璧でした-help list.exe /?コマンドは多くの情報を提供しませんが、エディター内で一度押すとコマンドが?表示されます。H六角エディタが開き、&F1六角の表示方法を切り替えます
Coruscate5

7

これは、XP以降のすべてでも機能します。

certutil -encodehex MyProgram.exe MyProgram.txt

XPでは、ここからWindows Server 2003管理ツールパックが必要です。

https://www.microsoft.com/en-us/download/details.aspx?id=16770


これはまだすべての答えの上にありませんされている理由のウィンドウ上で最もポータブルおよびバックcompatableソリューションは、驚いて、Windowsバッチスクリプトからでも使用することができ
Andryの

6

.COMベース名が8文字以下の拡張子を持つ名前にファイルをコピーします。走る

DEBUG your_filename

' -'プロンプトが表示されます。タイプ

DEnter

繰り返しにD時isplayファイル128バイト。タイプ

D 住所 Enter

addressで始まる128バイトを表示するには、16進数で入力する必要があります。ファイルの先頭はアドレス100です。

D アドレス1アドレス2 Enter

アドレス1からアドレス2までを表示します。タイプ

D アドレス LNUM Enter

addressから始まるnumバイト(長さ)を表示します。  numも16進数で入力されます。使用Qして終了します。

例えば、

C:\Users\scott\Documents> debug thispost.com
-d
0BE4:0100  43 6F 70 79 20 74 68 65-20 66 69 6C 65 20 74 6F   Copy the file to
0BE4:0110  20 61 20 6E 61 6D 65 20-77 69 74 68 20 61 20 2E    a name with a .
0BE4:0120  43 4F 4D 20 65 78 74 65-6E 73 69 6F 6E 2C 20 77   COM extension, w
0BE4:0130  68 65 72 65 20 74 68 65-20 62 61 73 65 20 6E 61   here the base na
0BE4:0140  6D 65 20 69 73 20 6E 6F-20 6C 6F 6E 67 65 72 20   me is no longer
0BE4:0150  74 68 61 6E 20 65 69 67-68 74 20 63 68 61 72 61   than eight chara
0BE4:0160  63 74 65 72 73 2E 0D 0A-52 75 6E 20 44 45 42 55   cters...Run DEBU
0BE4:0170  47 20 2A 79 6F 75 72 5F-66 69 6C 65 6E 61 6D 65   G *your_filename
-d
0BE4:0180  2A 0D 0A 49 74 20 77 69-6C 6C 20 67 69 76 65 20   *..It will give
0BE4:0190  61 20 27 2D 27 20 70 72-6F 6D 70 74 2E 0D 0A 54   a '-' prompt...T
0BE4:01A0  79 70 65 20 44 20 45 6E-74 65 72 20 72 65 70 65   ype D Enter repe
0BE4:01B0  61 74 65 64 6C 79 20 74-6F 20 2A 2A 64 2A 2A 69   atedly to **d**i
0BE4:01C0  73 70 6C 61 79 20 74 68-65 20 66 69 6C 65 20 31   splay the file 1
0BE4:01D0  32 38 20 62 79 74 65 73-20 61 74 20 61 20 74 69   28 bytes at a ti
0BE4:01E0  6D 65 2E 0D 0A 54 79 70-65 20 44 20 5F 61 64 64   me...Type D _add
0BE4:01F0  72 65 73 73 5F 20 74 6F-20 64 69 73 70 6C 61 79   ress_ to display
-d 200 L16
0BE4:0200  20 31 32 38 20 62 79 74-65 73 20 73 74 61 72 74    128 bytes start
0BE4:0210  69 6E 67 20 61 74                                 ing at
-

3
残念ながら、ファイルが.COMの最大値である約64KBより大きい場合は機能しません。(オフセット100hから始まるセグメントに収まる必要があります。)
ケン

1
C:\>attrib debug.exe /s。結果:File not found - debug.exe。公式を見つけることができなかったため、デバッグはサポートされなくなりましたが、Webで見たところ、デバッグサポートはしばらく前に削除されたようです。MicrosoftのDebugDiagを見つけました。(追加ダウンロード)デバッグしますか?たぶん、HEXでのファイルの表示をサポートしていますか?.MSIファイルとして配信されます。インストールするには管理者パスワードが必要です。私は一人ではありません。
シャノン退職

@Ken私はすでにhead -c4096 bigFileName > smallFileNameLinuxでファイルの最初の4 KBを取得するために使用していました。行は十分に小さいので、4 KBには私の目的のために十分な行があります
シャノンセヴェランス

それでは、なぜhexdump -CLinux上で使用しないのですか?
ケン

3
@ShannonデバッグはDOSの一部であるため、x64を使用している場合はそこにありません。
-kinokijuf


5

Windows 7にはdotnet framework 3.5が組み込まれているため、C#コンパイラが組み込まれているため、たとえばhttp://illegalargumentexception.blogspot.co.uk/2008/04/c-からリストを取得できます。 file-hex-dump-application.htmlを使用してコンパイルします

  \windows\Microsoft.NET\Framework\v3.5\csc printhex.cs 

そして、16進文字とASCII文字の両方を表示するprinthex.exeで終わる必要があります。


簡単で、巨大なダウンロードの必要はありません。
ライブ愛14

2

それは理想的ではありませんが、本当に何もダウンロードしたくない場合は、 fc / b(つまり、バイナリモードでのファイル比較)を使用してこのファイルを別の完全に異なるファイルと比較してみてください。異なる各バイトの値。2つのファイルで同じ値が発生する可能性があるため、出力からスキップされる可能性がありますが、オフセット列の欠損値をチェックすることで発生するかどうかを確認できます。


理想的ではありませんが、0x00バイトのファイルを作成し、それと比較することでそうすることができました。私が探していたテキストファイルであり、0aと0dに興味があったのは、比較がうまくいったときに主にnullのファイルでした。しかし、キャラクタービューと16進ビューの両方を並べて表示することはできません。(Scottの答えでデバッグが、Emacsのhexlモードがそうであるように、横並びのビューを要求していませんでしたが、実際に16進ダンプを使用する方法にとっては非常に重要です。)
Shannon Severance

2

Get-Contentと共に以下のPowerShell関数を使用して、ファイルコンテンツのhexdumpを表示できますGet-Content -Encoding Byte 'MyFile.bin' | Format-HexDump。222 KBファイルのダンプには約23秒かかります。必要に応じて、出力をテキストファイルにリダイレクトして、ダンプの調査を容易にすることができます。

$encodingAutoCompleter = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    $availableEncodings = ([System.Text.Encoding]::GetEncodings() | Select Name, CodePage, DisplayName) + @( [PSCustomObject] @{ CodePage = '20127'; Name = 'ascii'; DisplayName = 'US-ASCII' }, [PSCustomObject] @{ CodePage = '1200'; Name = 'unicode'; DisplayName = 'Unicode' } )
    $availableEncodings | ?{ $_.Name.StartsWith($wordToComplete) } | %{ New-Object System.Management.Automation.CompletionResult -ArgumentList $_.Name, $_.Name, 'ParameterValue', "$($_.DisplayName). Code Page $($_.CodePage)." }
}

function Format-BufferText([byte[]] $buffer, [System.Text.Encoding] $displayEncoding, [switch] $useControlPictures)
{
    $bufferChars = $displayEncoding.GetChars($buffer);
    $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { if ($useControlPictures -eq $false) { '.' } else { [char] ($_.ToInt16([cultureinfo]::InvariantCulture) + 0x2400) } } else { "$_" } }) -join "")

    $bufferText
}

<#
    .Synopsis
    Displays binary data as a hexadecimal dump.

    .Description
     Displays binary data as a hexadecimal dump. Options are available to suppress displaying text and to display control characters 
     as Unicode Control Pictures instead of dots.

    .Parameter Bytes
    The bytes to be displayed.

    .Parameter Encoding
    The name of the text encoding to use. The default is ascii.

    .Parameter NoTextDisplay
    If specified the text display sidebar will be suppressed; otherwise, the display text sidebar will be present.

    .Parameter UseControlPictures
    If specified control characters will be displayed as Unicode Control pictures; otherwise, dots are used to represent control 
    characters.

    .Example
    Format-HexDump -Encoding unicode $bytes

    .Example
    Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump -Encoding unicode

    .Example
    0..255 | Format-HexDump -NoTextDisplay
#>
function Format-HexDump
{
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [byte[]] $Bytes,
        [ValidateScript({ if (([System.Text.Encoding]::GetEncodings().Name + @('unicode', 'ascii')) -icontains $_) { return $true } else { Throw "Encoding must be one of the following: $([System.Text.Encoding]::GetEncodings().Name -join ', '), unicode, or ascii." } })]
        [Parameter(ValueFromPipeline = $false)]
        [string] $Encoding = "ASCII",
        [Parameter()]
        [switch] $NoTextDisplay,
        [Parameter()]
        [switch] $UseControlPictures
    )

    BEGIN
    {
        $displayEncoding = [System.Text.Encoding]::GetEncoding($Encoding)

        $counter = 0
        $hexRow = ""
        [byte[]] $buffer = @()
    }

    PROCESS
    {
        foreach ($byte in $Bytes)
        {
            $buffer += $byte
            $hexValue = $byte.ToString("X2")

            if ($counter % 16 -eq 0)
            {
                $buffer = @($byte)
                $hexRow = "$($counter.ToString("X8")): $($hexValue) "
            }
            elseif ($counter % 16 -eq 15)
            {
                if ($NoTextDisplay -eq $true)
                {
                    $hexRow += "$($hexValue)"
                    $hexRow
                }
                else
                {
                    $bufferText = Format-BufferText $buffer $displayEncoding $UseControlPictures
                    $hexRow += "$($hexValue)   $($bufferText)"
                    $hexRow
                }
            }
            else
            {
                $hexRow += "$($hexValue) "
            }

            $counter++
        }
    }

    END
    {
        $counter--

        if ($counter % 16 -ne 15)
        {
            $hexRow += " " * (((16 - $counter % 16) * 3) - 1)

            if ($NoTextDisplay -eq $false)
            {
                $bufferText = Format-BufferText $buffer $displayEncoding $UseControlPictures
                $hexRow += "$($bufferText)"
            }

            $hexRow
        }
    }
}

Register-ArgumentCompleter -CommandName Format-HexDump -ParameterName Encoding -ScriptBlock $encodingAutoCompleter

出力は次のようになります。

00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   ................
00000010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F   ................
00000020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F    !"#$%&'()*+,-./
00000030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F   0123456789:;<=>?
00000040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F   @ABCDEFGHIJKLMNO
00000050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F   PQRSTUVWXYZ[\]^_
00000060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F   `abcdefghijklmno
00000070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F   pqrstuvwxyz{|}~.
00000080: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F   ????????????????
00000090: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F   ????????????????
000000A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF   ????????????????
000000B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF   ????????????????
000000C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF   ????????????????
000000D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF   ????????????????
000000E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF   ????????????????
000000F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF   ????????????????

または、単にFormat-Hexファイル名を使用
-techdude

@techdude Format-Hexは、PowerShellのすべてのバージョンで使用できるわけではありません。PowerShell 4以前には存在しません。Format-Hexが存在する前に、このコードを書きました。
-JamieSee

これをバイナリファイルに戻す方法は?
ジンバ


0

Emacsを使用していることは知っていますが、Vimユーザーはxxdユーティリティを使用できます。

xxd -s <start_offset> -l <length_offest> <file>

すなわち

Usage:
       xxd.exe [options] [infile [outfile]]
    or
       xxd.exe -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]
Options:
    -a          toggle autoskip: A single '*' replaces nul-lines. Default off.
    -b          binary digit dump (incompatible with -ps,-i,-r). Default hex.
    -c cols     format <cols> octets per line. Default 16 (-i: 12, -ps: 30).
    -E          show characters in EBCDIC. Default ASCII.
    -g          number of octets per group in normal output. Default 2.
    -h          print this summary.
    -i          output in C include file style.
    -l len      stop after <len> octets.
    -ps         output in postscript plain hexdump style.
    -r          reverse operation: convert (or patch) hexdump into binary.
    -r -s off   revert with <off> added to file positions found in hexdump.
    -s [+][-]seek  start at <seek> bytes abs. (or +: rel.) infile offset.
    -u          use upper case hex letters.
    -v          show version: "xxd V1.10 27oct98 by Juergen Weigert (Win32)".
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.