Bagaimana saya bisa melihat konten biner file secara asli di Windows 7? (Apa itu mungkin.)

35

Saya punya file, sedikit lebih besar dari 500MB, yang menyebabkan beberapa masalah.

Saya yakin masalahnya ada pada konvensi end of line (EOL) yang digunakan. Saya ingin melihat file dalam bentuk mentah yang tidak diinterpretasikan (1) untuk mengkonfirmasi konvensi EOL file.

Bagaimana saya bisa melihat "biner" dari file menggunakan sesuatu yang dibangun di dalam Windows 7? Saya lebih suka menghindari keharusan mengunduh apa pun yang tambahan.

(1) Rekan kerja saya dan saya membuka file dalam editor teks, dan mereka menunjukkan garis seperti yang diharapkan. Tetapi kedua editor teks akan membuka file dengan konvensi EOL yang berbeda dan menafsirkannya secara otomatis. (TextEdit dan Emacs 24.2. Untuk Emacs saya telah membuat file kedua dengan hanya menggunakan 4K byte pertama head -c4096pada kotak linux dan membukanya dari kotak windows saya.

Saya mencoba menggunakan hexl-mode di Emacs, tetapi ketika saya pergi ke hexl-mode dan kembali ke mode teks, isi buffer telah berubah, menambahkan ^ M yang terlihat di akhir setiap baris, jadi saya tidak percaya itu saat ini.

Saya percaya masalah ini mungkin pada karakter akhir baris yang digunakan. Para editor rekan kerja saya dan saya mencoba (1) secara otomatis mengenali konvensi garis akhir dan menunjukkan kepada kami garis. Dan berdasarkan bukti lain saya percaya konvensi EOL adalah carriage return saja. (2) hanya kembali.

Untuk mengetahui apa yang sebenarnya ada dalam file tersebut, saya ingin melihat isi biner dari file tersebut, atau setidaknya beberapa ribu byte file, lebih disukai di Hex, meskipun saya dapat bekerja dengan desimal atau oktal. Hanya angka nol yang cukup sulit untuk dilihat.

MEMPERBARUI

Kecuali yang disarankan DEBUG, semua jawaban di bawah ini berfungsi sampai batas tertentu. Saya telah memilih masing-masing sebagai bermanfaat. Pertanyaan saya tidak lengkap. Dalam menguji setiap solusi yang disarankan, saya menemukan bahwa saya benar-benar ingin melihat heks berdampingan dan konten teks, dan bahwa saya ingin itu menjadi sesuatu di mana ketika saya meletakkan kursor di atas sesuatu, baik nilai byte atau karakter teks, hal yang cocok pada sisi lain akan disorot.

Saya benar-benar memecahkan masalah saya ketika Emacs hexl-mode mulai bekerja "dengan benar". Jadi saya akhirnya tidak menggunakan jawaban ini, hanya mengujinya. (Benar-benar harus menyelidiki perilaku aneh Emacs dan mengajukan laporan bug.)

Shannon Severance
sumber
Mungkin ada semacam alat di bawah Cygwin, tetapi itu membutuhkan instalasi Cygwin. Atau jika Anda memiliki, misalnya, Java yang diinstal pada kotak Anda, itu akan menjadi tugas yang cukup sederhana untuk menulis program hex dump di Jawa.
Daniel R Hicks

Jawaban:

11

Anda memerlukan "hex editor". Saya telah menggunakan "Hex Editor Neo" selama bertahun-tahun dan ini sangat bagus. Ini tersedia dalam versi gratis dan berbayar . (Dan saya yakin ada alat serupa lainnya yang tersedia.)

Daniel R Hicks
sumber
4
Saya telah bertanya bagaimana, tanpa apa pun selain Windows 7 karena saya tidak suka menambahkan program tambahan karena 1) Banyak yang menginstal dengan cara yang haknya tidak saya izinkan. 2) Beberapa terlihat cerdik. Yang mengatakan Hex Editor Neo terlihat menjadi rekomendasi yang bagus. +1
Shannon Severance
1
zblist.com adalah program mandiri yang tidak perlu diinstal atau memerlukan hak khusus dan memiliki mode Alt-H atau hex
sgmoore
Memenuhi semua persyaratan saya termasuk dinyatakan, salah saji, tidak disebutkan. Hex Editor Neo juga cepat, dan telah ditambahkan ke tas alat saya.
Shannon Severance
1. Editor lain bukan asli. 2. Manajer file bagus untuk tujuan ini dan ada banyak yang portabel. 3. Ketik perintah dapat menampilkan konten secara asli dan memiliki filter yang berguna (seperti halaman per halaman)
Overmind
37

Jika Anda memiliki PowerShell versi 5.0 atau yang lebih baru, Anda dapat menggunakan powershellfungsi bawaanFormat-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.
AzizSM
sumber
4
Terus terang saya terkejut bahwa ini bukan jawaban teratas. Ini adalah cara yang benar untuk melakukannya menggunakan alat bawaan di windows. Jika Anda ingin menulis output ke file, Anda dapat menggunakan> Format-Hex application.exe> ​​out.txt
techdude
Ini sepertinya bagus, tetapi Format-Hextidak tersedia di PowerShell saya; Saya hanya mendapatkan kesalahan "tidak dikenali"
Kidburla
Menurut JamieSee, itu tampaknya tidak ditambahkan sampai PowerShell 5.0.
techdude
26

Dibangun di, cepat dan kotor: mulai powershell, jalankan:

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

TotalCount adalah hitungan byte yang ingin Anda baca dari file.

Google 'powershell hexdump' untuk mendapatkan versi yang lebih halus / bisa diterapkan.

Jika Anda memiliki Windows Resource Kit Tools (bukan built-in, tetapi tutup) Anda juga dapat menggunakan utilitas garis cmd yang disebut list.exe. Ini adalah editor kecil dengan mode hex. Dirancang khusus untuk bekerja dengan file besar:

Daftar Alat File Teks (Daftar) adalah alat baris perintah yang menampilkan dan mencari satu atau lebih file teks. Tidak seperti alat tampilan teks lainnya, Daftar tidak membaca seluruh file ke dalam memori ketika Anda membukanya. Ini memungkinkan pengguna untuk mengedit file teks dalam format heksadesimal.

Daftar berguna untuk menampilkan file teks atau log dari jarak jauh, dan untuk digunakan pada server di mana administrator terkait dengan penurunan kinerja sistem.

wmz
sumber
1
Sejauh ini, solusi ini adalah yang terdekat yang saya minta.
Shannon Severance
1
Bagus, sederhana, sudah terpasang. Saya mengubah format menjadi write-host ("{0: X2}" untuk memaksa 0x0A tampil sebagai "0A" bukan "A", angka 2 untuk 2 digit huruf besar karena itulah yang saya suka
Adam Straughan
1
List.exe sempurna - list.exe /?perintah bantuan tidak memberikan banyak info, tetapi begitu di dalam editor tekan saja ?untuk melihat perintah. Hmembuka Hex editor, & F1matikan cara Hex ditampilkan
Coruscate5
7

Ini juga berfungsi untuk semuanya setelah XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP memerlukan Paket Alat Administrasi Windows Server 2003 dari sini:

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

bunga api
sumber
solusi yang paling portabel dan kompatibel kembali pada windows, dapat digunakan bahkan dari skrip batch windows, heran mengapa ini masih belum ada di atas semua jawaban
Andry
6

Salin file ke nama dengan .COMekstensi, di mana nama dasar tidak lebih dari delapan karakter. Menjalankan

DEBUG nama_anda

Ini akan memberi -prompt ' '. Mengetik

DEnter

berulang kali untuk d isplay file 128 byte pada suatu waktu. Mengetik

D alamat Enter

untuk menampilkan 128 byte dimulai dari alamat , yang harus diketik dalam hex, di mana awal file adalah alamat 100. Ketik

D alamat 1 alamat 2 Enter

untuk menampilkan dari alamat 1 ke alamat 2 . Mengetik

D alamat Lnum Enter

untuk menampilkan num byte (panjang) mulai dari alamatnum juga dimasukkan dalam hex. Gunakan Quntuk berhenti.

Sebagai contoh,

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
-
Scott
sumber
3
Sayangnya itu tidak akan berfungsi jika file lebih besar dari sekitar 64KB, maks untuk .COM. (Ini harus masuk dalam segmen mulai dari offset 100 jam.)
Ken
1
C:\>attrib debug.exe /s. Hasil: File not found - debug.exe. Tidak dapat menemukan pernyataan resmi, debug tidak lagi didukung , tetapi dari apa yang saya lihat di web sepertinya dukungan debug telah dihapus beberapa saat yang lalu. Saya menemukan DebugDiag dari Microsoft. (Unduhan ekstra.) Melakukan debugging? Mungkin itu mendukung melihat file di HEX? Dikirim sebagai file .MSI. Membutuhkan kata sandi admin untuk menginstal. Saya bukan satu.
Shannon Severance
@ Ben saya sudah menggunakan head -c4096 bigFileName > smallFileNamedi linux untuk mendapatkan 4 KB pertama dari file. Garis cukup kecil sehingga empat KB memiliki banyak saluran untuk keperluan saya
Shannon Severance
Jadi mengapa tidak digunakan hexdump -Csaat di Linux?
Ken
3
@Shannon debug adalah bagian dari DOS, dan karena itu, jika Anda menggunakan x64, itu tidak ada.
kinokijuf
5

Karena Windows 7 dilengkapi dengan kerangka kerja dotnet 3.5 bawaan, Anda akan memiliki kompiler C # bawaan, sehingga Anda dapat mengambil, misalnya, daftar dari http://illegalargumentexception.blogspot.co.uk/2008/04/c- file-hex-dump-application.html dan kemudian kompilasi menggunakan

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

dan Anda harus berakhir dengan printhex.exe yang akan menampilkan karakter hex dan ascii.

sgmoore
sumber
Sederhana, dan tidak perlu mengunduh raksasa.
live-love
2

Ini tidak ideal, tetapi jika Anda benar-benar tidak ingin mengunduh apa pun, maka Anda dapat mencoba menggunakan fc / b (yaitu membandingkan file dalam mode biner) untuk membandingkan file ini dengan file lain yang sama sekali berbeda, dan itu akan menunjukkan kepada Anda hex nilai setiap byte yang berbeda. Anda mungkin akan mendapatkan beberapa nilai yang kebetulan sama di kedua file dan karenanya dapat dilewati dari output, tetapi Anda dapat mengetahui apakah itu terjadi dengan memeriksa nilai-nilai yang hilang di kolom offset.

sgmoore
sumber
Tidak ideal, tetapi saya bisa melakukannya dengan membuat file 0x00 byte dan kemudian membandingkannya. Menjadi file teks yang saya lihat, dan bahwa saya tertarik pada 0a dan 0d sebagian besar file nulls sebagai perbandingan berfungsi. Tapi itu tidak memberikan tampilan karakter dan tampilan hex berdampingan membuat menemukan di mana saya ingin terlihat lebih keras. (Seperti debug dalam jawaban Scott dan seperti mode hexl Emacs. Saya tidak meminta tampilan berdampingan, tetapi cukup penting untuk bagaimana saya benar-benar menggunakan hex dumps.)
Shannon Severance
2

Anda dapat menggunakan fungsi PowerShell di bawah ini bersama Get-Content untuk melihat hexdump dari isi file, yaitu Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump,. Dibutuhkan sekitar 23 detik untuk membuang file 222 KB dan, jika diinginkan, hasilnya dapat diarahkan ke file teks untuk mempermudah pemeriksaan dump.

$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

Output terlihat seperti ini:

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   ????????????????
JamieSee
sumber
Atau cukup gunakan nama file Format-Hex
techdude
@techdude Format-Hex tidak tersedia di semua versi PowerShell. Itu tidak ada di PowerShell 4 dan sebelumnya. Saya menulis kode ini sebelum Format-Hex pernah ada.
JamieSee
Bagaimana cara mengembalikan ini kembali ke file biner?
Zimba
0

Saya tahu Anda menggunakan Emacs tetapi pengguna Vim dapat menggunakan xxdutilitas:

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

yaitu

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)".
Michaelangel007
sumber