2012-08-30 22:25:48 +0000 2012-08-30 22:25:48 +0000
37
37

Как просмотреть бинарное содержимое файла в Windows 7? (Возможно ли это.)

У меня есть файл, чуть больше 500 МБ, который вызывает некоторые проблемы.

Я считаю, что проблема находится в конце строки (EOL) используемой конвенции. Я хотел бы посмотреть на файл в его необработанном виде (1), чтобы подтвердить конвенцию EOL этого файла.

Как я могу просмотреть “двоичный” файл, используя что-то встроенное в Windows 7? Я бы предпочел избежать необходимости скачивать что-либо дополнительное.

(1) Мы с коллегой открыли файл в текстовых редакторах, и они показывают строки, как и следовало ожидать. Но оба текстовых редактора откроют файлы с различными конвенциями EOL и интерпретируют их автоматически. (TextEdit и Emacs 24.2. Для Emacs я создал второй файл, содержащий только первые 4K байт, используя head -c4096 на linux box, и открыл его из своего windows box.

я попытался использовать hexl-режим в Emacs, но когда я перешел в hexl-режим и вернулся в текстовый режим, содержимое буфера изменилось, добавив видимый ^M в конец каждой строки, так что на данный момент я этому не доверяю.

Я думаю, что проблема может быть в конце используемого символа(ов) строки. Редакторы, мы с коллегой попробовали (1) просто автоматически распознать условность конца строки и показать нам строки. И, основываясь на других доказательствах, я считаю, что конвенция EOL - это только возврат каретки. (2) только возврат.

Чтобы узнать, что на самом деле находится в файле, я хотел бы посмотреть на двоичное содержимое файла, или, по крайней мере, на пару тысяч байт файла, предпочтительно в Hex, хотя я мог бы работать с десятичными или восьмеричными числами. На одни нули было бы довольно грубо смотреть.

UPDATE

За исключением того, который предлагает DEBUG, все ответы ниже в той или иной степени работают. Я проголосовал за каждый из них как за полезный. Мой вопрос был плохо сформулирован. При тестировании каждого из предложенных решений я обнаружил, что мне очень хотелось, чтобы рядом был просмотр шестнадцатеричного и текстового содержимого, и что я хотел, чтобы это было что-то такое, где, когда я наведу курсор на что-то, либо на значение байта, либо на текстовый символ, соответствующая вещь с другой стороны будет выделена.

я на самом деле решил свою проблему, когда Emacs hexl-режим начал работать “правильно”. В итоге я не использовал ни одного из этих ответов, а только тестировал их (действительно должен был исследовать странное поведение Emacs и отправить сообщение об ошибке).

Ответы (11)

43
43
43
2017-09-06 05:04:26 +0000

Если у вас есть Powerhell версии 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.
```.
26
26
26
2012-08-31 00:35:08 +0000

Встроенный, быстрый и грязный: запустить powershell, выполнить:

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

TotalCount - это количество байт, которое вы хотите прочитать из файла.

Google ‘powerhell hexdump’, чтобы получить гораздо более отполированные/рабочие версии.

Если у вас есть Windows Resource Kit Tools (не совсем встроенные, но близкие), вы также можете использовать утилиту командной строки под названием list.exe. Это небольшой редактор с шестнадцатиричным режимом. Разработана специально для работы с большими файлами:

List Text File Tool (List) - инструмент командной строки, который отображает и выполняет поиск одного или нескольких текстовых файлов. В отличие от других инструментов отображения текста, List не считывает весь файл в память при его открытии. Он позволяет пользователю редактировать текстовый файл в шестнадцатеричном формате.

Список полезен для удаленного отображения текстовых или лог-файлов, а также для использования на серверах, где администраторы обеспокоены снижением производительности системы.

11
11
11
2012-08-31 00:05:36 +0000

Тебе нужен “шестнадцатиричный редактор”. Я использовал “Hex Editor Neo” много лет и он очень хорош. Он доступен в бесплатной и платной версии . (И я уверен, что есть и другие подобные инструменты.)

7
7
7
2018-09-06 00:15:24 +0000

Это также работает на всех после XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP требуется пакет Windows Server 2003 Administration Tools Pack отсюда : https://www.microsoft.com/en-us/download/details.aspx?id=16770

6
6
6
2012-08-30 23:48:49 +0000

Скопируйте файл в имя с расширением .COM, где базовое имя не более восьми символов.  Запустите

DEBUG your_filename

Появится запрос ‘ -’.  Введите

DВведите

несколько раз в d проигрывается файл размером 128 байт за один раз.   Введите

D адрес Введите

для отображения 128 байт, начиная с адреса, который должен быть набран в hex, где началом файла является адрес 100.  Введите

D адрес1 address2 Введите

для отображения от адреса1 до адреса2.   Введите

D адрес Lnum Введите

для отображения num байт (длина), начиная с addressnum также вводится в hex.  Используйте 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
-
6
6
6
2014-02-12 22:39:12 +0000

HxD - это портативный шестнадцатиричный редактор, который не требует установки и представляет собой не более одного exe-файла. http://mh-nexus.de/en/hxd/

Еще одна аналогичная переносная опция - Frhed: http://frhed.sourceforge.net/en/screenshots/

5
5
5
2012-08-31 08:52:04 +0000

Поскольку Windows 7 поставляется со встроенным дотнетным фреймворком 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

, и в итоге получится printhex.exe, который должен отображать как шестнадцатеричные, так и строчные символы (ascii).

2
2
2
2012-08-30 23:04:31 +0000

Это не идеально, но если вы действительно не хотите ничего загружать, то вы можете попробовать использовать fc /b (т.е. сравнение файлов в бинарном режиме), чтобы сравнить этот файл с другим совершенно другим файлом, и он покажет вам шестнадцатеричные значения каждого байта, которые отличаются. Вы можете получить некоторые значения, которые случайно окажутся одинаковыми в двух файлах, и поэтому могут быть пропущены из вывода, но вы можете сказать, если это произойдет, проверив пропущенные значения в колонке смещения.

2
2
2
2016-06-06 15:42:30 +0000

Вы можете использовать приведенную ниже функцию PowerShell вместе с Get-Content для просмотра шестнадцатиричного дампа содержимого файла, т.е. Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Для создания дампа файла размером 222 КБ требуется около 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 ????????????????
1
1
1
2017-05-04 12:26:00 +0000

Поскольку Sublime text - мой любимый редактор, я использую его плагин для просмотра шестнадцатиричных файлов. http://facelessuser.github.io/HexViewer/

0
0
0
2017-08-25 01:07:56 +0000

Я знаю, что вы используете 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)".

Похожие вопросы

3
28
13
7
4