Làm cách nào tôi có thể xem nội dung nhị phân của một tệp nguyên bản trong Windows 7? (Có thể không.)


35

Tôi có một tệp, lớn hơn 500MB một chút, điều đó gây ra một số vấn đề.

Tôi tin rằng vấn đề nằm ở quy ước cuối dòng (EOL) được sử dụng. Tôi muốn xem xét tệp ở dạng thô chưa được giải thích (1) để xác nhận quy ước EOL của tệp.

Làm cách nào tôi có thể xem "nhị phân" của tệp bằng cách sử dụng nội dung được tích hợp trong Windows 7? Tôi muốn tránh phải tải xuống bất cứ điều gì thêm.

(1) Đồng nghiệp của tôi và tôi đã mở tệp trong trình chỉnh sửa văn bản và họ hiển thị các dòng như mong đợi. Nhưng cả hai trình soạn thảo văn bản sẽ mở các tệp với các quy ước EOL khác nhau và diễn giải chúng một cách tự động. (TextEdit và Emacs 24.2. Đối với Emacs tôi đã tạo một tệp thứ hai chỉ với các byte 4K đầu tiên sử dụng head -c4096trên hộp linux và mở nó từ hộp windows của tôi.

Tôi đã cố sử dụng chế độ hexl trong Emacs, nhưng khi tôi chuyển sang chế độ hexl và quay lại chế độ văn bản, nội dung của bộ đệm đã thay đổi, thêm ^ M vào cuối mỗi dòng, vì vậy tôi không tin tưởng rằng tại thời điểm này.

Tôi tin rằng vấn đề có thể nằm ở cuối (các) ký tự được sử dụng. Các biên tập viên đồng nghiệp của tôi và tôi đã thử (1) chỉ tự động nhận ra kết thúc quy ước dòng và cho chúng tôi xem các dòng. Và dựa trên các bằng chứng khác, tôi tin rằng quy ước EOL chỉ là vận chuyển trở lại. (2) chỉ trả lại.

Để biết những gì thực sự có trong tệp, tôi muốn xem xét nội dung nhị phân của tệp, hoặc ít nhất là vài nghìn byte của tệp, tốt nhất là trong Hex, mặc dù tôi có thể làm việc với số thập phân hoặc bát phân. Chỉ cần một số không sẽ là khá thô để xem xét.

CẬP NHẬT

Ngoại trừ một gợi ý DEBUG, tất cả các câu trả lời dưới đây hoạt động ở mức độ này hay mức độ khác. Tôi đã bình chọn từng người trong số họ là hữu ích. Câu hỏi của tôi đã không thành hình. Khi thử nghiệm từng giải pháp được đề xuất, tôi thấy tôi thực sự muốn xem nội dung văn bản và hex bên cạnh và tôi muốn nó là thứ gì đó khi tôi đưa con trỏ lên một thứ gì đó, hoặc là một giá trị byte hoặc ký tự văn bản, thứ phù hợp trên mặt khác sẽ được làm nổi bật.

Tôi thực sự đã giải quyết vấn đề của mình khi chế độ hexl của Emacs bắt đầu hoạt động "chính xác". Vì vậy, tôi đã kết thúc việc không sử dụng bất kỳ câu trả lời nào trong số này, chỉ kiểm tra chúng. (Thực sự nên điều tra hành vi kỳ lạ của Emacs và gửi báo cáo lỗi.)


Có thể có một số loại công cụ theo Cygwin, nhưng điều đó sẽ yêu cầu cài đặt Cygwin. Hoặc nếu bạn có, ví dụ, Java được cài đặt trên hộp của bạn, thì việc viết chương trình kết xuất hex trong Java là một nhiệm vụ khá đơn giản.
Daniel R Hicks

Câu trả lời:


11

Bạn cần một "trình soạn thảo hex". Tôi đã sử dụng "Hex Editor Neo" trong nhiều năm và nó rất tốt. Nó có sẵn trong các phiên bản miễn phí và trả phí . (Và tôi chắc chắn có những công cụ tương tự khác có sẵn.)


4
Tôi đã hỏi làm thế nào, không có gì ngoài Windows 7 vì tôi không thích thêm các chương trình bổ sung vì 1) Nhiều người cài đặt theo cách mà các quyền tôi không cho phép. 2) Một số người trông có vẻ tinh ranh. Điều đó nói rằng Hex Editor Neo có vẻ là một đề xuất tốt. +1
Shannon Severance

1
zblist.com là một chương trình độc lập không cần cài đặt hoặc cần bất kỳ quyền đặc biệt nào và có chế độ Alt-H hoặc hex
sgmoore

Đáp ứng tất cả các yêu cầu của tôi bao gồm cả tuyên bố, sai, không nói. Hex Editor Neo cũng rất nhanh và đã được thêm vào túi công cụ của tôi.
Shannon Severance

1. Các biên tập viên khác không phải là người bản xứ. 2. Trình quản lý tệp tốt cho mục đích này và có rất nhiều xung quanh có thể mang theo được. 3. Lệnh Type có thể hiển thị nội dung nguyên bản và có các bộ lọc hữu ích (như từng trang).
Overmind

37

Nếu bạn có phiên bản powershell 5.0 trở lên, bạn có thể sử dụng powershellchức năng tích hợp sẵnFormat-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
Tôi thực sự ngạc nhiên rằng đây không phải là câu trả lời hàng đầu. Đây là cách chính xác để làm điều đó bằng cách sử dụng một công cụ tích hợp trong windows. Nếu bạn muốn ghi đầu ra vào một tệp, bạn có thể sử dụng> Format-Hex application.exe> ​​out.txt
techdude

Điều này có vẻ tốt, nhưng Format-Hexkhông có sẵn trong PowerShell của tôi; Tôi chỉ nhận được một lỗi "không được công nhận"
Kidburla

Theo JamieSee, dường như nó không được thêm vào cho đến khi 5.0.
techdude

26

Được xây dựng trong, nhanh chóng và bẩn: bắt đầu powershell, thực hiện:

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

TotalCount là số byte bạn muốn đọc từ tệp.

Google 'powershell hexdump' để có được các phiên bản hoàn hảo hơn / khả thi hơn.

Nếu bạn có Windows Resource Kit Tools (không được tích hợp chính xác, nhưng đóng), bạn cũng có thể sử dụng tiện ích dòng cmd được gọi list.exe. Đó là một trình soạn thảo nhỏ với chế độ hex. Được thiết kế đặc biệt để làm việc với các tệp lớn:

Danh sách công cụ tệp văn bản (Danh sách) là một công cụ dòng lệnh hiển thị và tìm kiếm một hoặc nhiều tệp văn bản. Không giống như các công cụ hiển thị văn bản khác, Danh sách không đọc toàn bộ tệp vào bộ nhớ khi bạn mở nó. Nó cho phép người dùng chỉnh sửa tệp văn bản ở định dạng thập lục phân.

Danh sách rất hữu ích để hiển thị văn bản hoặc tệp nhật ký từ xa và để sử dụng trên các máy chủ nơi quản trị viên quan tâm đến sự suy giảm hiệu năng hệ thống.


1
Cho đến nay, giải pháp này là gần nhất mà tôi đã yêu cầu.
Shannon Severance

1
Đẹp, đơn giản, đã được cài đặt. Tôi đã thay đổi định dạng thành máy chủ ghi ("{0: X2}" để buộc 0x0A xuất hiện dưới dạng "0A" chứ không phải "A", chữ in hoa 2 chữ số 2 vì đó là cách tôi thích
Adam Strau Afghanistan

1
List.exe là hoàn hảo - list.exe /?lệnh trợ giúp không cung cấp nhiều thông tin, nhưng một khi bên trong trình chỉnh sửa chỉ cần nhấn ?để xem lệnh. Hmở trình soạn thảo Hex và F1bật tắt cách hiển thị của Hex
Coruscate5

7

Điều này cũng hoạt động trên mọi thứ sau XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP yêu cầu Gói công cụ quản trị Windows Server 2003 từ đây:

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


hầu hết các giải pháp tương thích di động và quay lại trên các cửa sổ, có thể được sử dụng ngay cả từ các tập lệnh bó của windows, thật ngạc nhiên tại sao điều này vẫn không nằm trong top của tất cả các câu trả lời
Andry

6

Sao chép tệp vào một tên có .COMphần mở rộng, trong đó tên cơ sở không dài hơn tám ký tự. Chạy

DEBUG your_filename

Nó sẽ đưa ra -dấu nhắc ''. Kiểu

DEnter

nhiều lần để d đang phát tập tin 128 byte mỗi lần. Kiểu

D địa chỉ nhà Enter

để hiển thị 128 byte bắt đầu tại địa chỉ , phải được nhập vào hex, trong đó phần đầu của tệp là địa chỉ 100. Nhập

D địa chỉ 1 địa chỉ 2 Enter

để hiển thị từ địa chỉ 1 đến địa chỉ 2 . Kiểu

D địa chỉ Lnum Enter

để hiển thị num byte (độ dài) bắt đầu tại địa chỉnum cũng được nhập vào hex. Sử dụng Qđể bỏ thuốc lá.

Ví dụ,

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
Thật không may, nó sẽ không hoạt động nếu tệp lớn hơn khoảng 64KB, tối đa cho một .COM. (Nó phải phù hợp với phân khúc bắt đầu từ offset 100h.)
Ken

1
C:\>attrib debug.exe /s. Kết quả : File not found - debug.exe. Không thể tìm thấy chính thức, gỡ lỗi không còn là tuyên bố được hỗ trợ , nhưng từ những gì tôi thấy trên web, có vẻ như hỗ trợ gỡ lỗi đã bị loại bỏ một lúc trước. Tôi tìm thấy DebugDiag từ Microsoft. (Tải thêm.) Gỡ lỗi? Có lẽ nó hỗ trợ xem các tập tin trong HEX? Được gửi dưới dạng tệp .MSI. Cần một mật khẩu quản trị để cài đặt. Tôi không phải là một.
Shannon Severance

@Ken Tôi đã sử dụng head -c4096 bigFileName > smallFileNametrên linux để nhận 4 KB đầu tiên của các tệp. Các dòng đủ nhỏ để bốn KB có nhiều dòng cho mục đích của tôi
Shannon Severance

Vậy tại sao không sử dụng hexdump -Ctrong khi trên Linux?
Ken

3
Gỡ lỗi @Shannon là một phần của DOS và như vậy, nếu bạn đang sử dụng x64, thì nó không có ở đó.
kinokijuf


5

Vì Windows 7 đi kèm với khung dotnet 3.5 được tích hợp sẵn, bạn sẽ có trình biên dịch C # được tích hợp sẵn, vì vậy bạn có thể lấy, ví dụ, danh sách từ http://illegalargumentexception.blogspot.co.uk/2008/04/c- file-hex-dump-application.html và sau đó biên dịch bằng

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

và bạn nên kết thúc với một printhex.exe sẽ hiển thị cả hai ký tự hex và ascii.


Đơn giản, và không cần tải xuống khổng lồ.
sống tình yêu

2

Nó không lý tưởng, nhưng nếu bạn thực sự không muốn tải xuống bất cứ thứ gì, thì bạn có thể thử sử dụng fc / b (tức là so sánh tệp ở chế độ nhị phân) để so sánh tệp này với một tệp hoàn toàn khác và nó sẽ hiển thị cho bạn hex giá trị của mỗi byte là khác nhau. Bạn có thể nhận được một số giá trị giống nhau trong hai tệp và do đó có thể bị bỏ qua khỏi đầu ra, nhưng bạn có thể biết liệu điều đó có xảy ra hay không bằng cách kiểm tra các giá trị bị thiếu trong cột bù.


Không lý tưởng, nhưng tôi đã có thể làm như vậy bằng cách tạo một tệp 0x00 byte và sau đó so sánh với điều đó. Là một tệp văn bản mà tôi đang xem và tôi quan tâm đến 0a và 0d chủ yếu là một tệp null khi so sánh hoạt động. Nhưng nó không cung cấp cả chế độ xem nhân vật và chế độ xem hex cạnh nhau khiến việc tìm kiếm nơi tôi muốn trở nên khó khăn hơn. (Như debug làm trong câu trả lời của Scott và như hexl chế độ Emacs của không tôi đã không yêu cầu bên xem mặt, nhưng nó khá quan trọng đối với làm thế nào tôi thực sự sử dụng bãi hex..)
Shannon Severance

2

Bạn có thể sử dụng chức năng PowerShell bên dưới cùng với Get-Content để xem hexdump của nội dung tệp, nghĩa là , Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Mất khoảng 23 giây để kết xuất tệp 222 KB và nếu muốn, đầu ra có thể được chuyển hướng đến tệp văn bản để giúp kiểm tra kết xuất dễ dàng hơn.

$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

Đầu ra trông như thế này:

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   ????????????????

Hoặc chỉ sử dụng tên tệp Format-Hex
techdude

@techdude Format-Hex không có sẵn trong tất cả các phiên bản PowerShell. Nó không tồn tại trong PowerShell 4 trở về trước. Tôi đã viết mã này trước khi Format-Hex tồn tại.
JamieSee

Làm thế nào để đảo ngược điều này trở lại tập tin nhị phân?
Zimba


0

Tôi biết bạn đang sử dụng Emacs nhưng người dùng Vim có thể sử dụng xxdtiện ích:

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

I E

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)".
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.