Как я могу просмотреть двоичное содержимое файла в Windows 7? (Является ли это возможным.)

35

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

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

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

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

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

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

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

ОБНОВИТЬ

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

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

Шеннон Северанс
источник
Вероятно, есть какой-то инструмент под Cygwin, но для этого потребуется установить Cygwin. Или, если на вашем компьютере установлена, например, Java, было бы довольно просто написать программу с шестнадцатеричным дампом на Java.
Даниэль Р Хикс

Ответы:

11

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

Даниэль Р Хикс
источник
4
Я спрашивал, как, без чего-либо, кроме Windows 7, потому что я не люблю добавлять дополнительные программы, потому что 1) Многие устанавливают так, как у меня нет прав. 2) Некоторые выглядят хитрыми. При этом Hex Editor Neo выглядит хорошей рекомендацией. +1
Шеннон Северанс
1
zblist.com - это отдельная программа, которая не требует установки или каких-либо специальных прав и имеет режим Alt-H или hex.
sgmoore
Выполнены все мои требования, в том числе заявленные, искаженные, неустановленные. Hex Editor Neo тоже был быстр и был добавлен в мою сумку с инструментами.
Шеннон Северанс
1. Другие редакторы не являются родными. 2. Файловые менеджеры хороши для этой цели, и есть много портативных. 3. Команда type может отображать содержимое изначально и имеет полезные фильтры (например, страницу за страницей).
Сверхразум
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.
AzizSM
источник
4
Я искренне удивлен, что это не лучший ответ. Это правильный способ сделать это с помощью встроенного в Windows инструмента. Если вы хотите записать вывод в файл, вы можете использовать> Format-Hex application.exe> ​​out.txt
techdude
Это кажется хорошим, но Format-Hexне доступно в моей PowerShell; Я просто получаю «не распознанную» ошибку
Кидбурла
Согласно JamieSee, он, по-видимому, не был добавлен до PowerShell 5.0.
techdude
26

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

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

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

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

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

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

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

WMZ
источник
1
Пока что это самое близкое решение, о котором я просил.
Шеннон Северанс
1
Красиво, просто, уже установлено. Я изменил формат на write-host ("{0: X2}", чтобы 0x0A отображалось как "0A", а не "A"), 2 для 2 цифр в верхнем регистре, потому что мне это нравится
Адам Страуган
1
List.exe был идеален - команда list.exe /?справки не дает много информации, но однажды в редакторе просто нажмите, ?чтобы увидеть команды. Hоткрывает редактор Hex, и F1переключает способ отображения Hex
Coruscate5
7

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

certutil -encodehex MyProgram.exe MyProgram.txt

XP требует пакета средств администрирования Windows Server 2003 здесь:

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

искры
источник
самое портативное и обратно совместимое решение для Windows, может использоваться даже из пакетных сценариев Windows, пораженных, почему это до сих пор не входит в число лучших ответов
Andry
6

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

DEBUG your_filename

Это даст -подсказку «». Тип

DEnter

повторно в г жаемое файл 128 байт за один раз. Тип

D адрес Enter

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

D адрес 1 адрес 2 Enter

отображать от адреса 1 до адреса 2 . Тип

D адрес Lномер Enter

для отображения Num байт (длина) , начиная с адресачисло также вводится в шестнадцатеричном виде. Используйте, 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
К сожалению, это не сработает, если размер файла превышает 64 КБ, максимум для .COM. (Он должен соответствовать сегменту, начинающемуся со смещением 100h.)
Кен,
1
C:\>attrib debug.exe /s, Результаты: File not found - debug.exe. Не удалось найти официальное заявление , отладка больше не поддерживается , но из того, что я увидел в Интернете, похоже, что поддержка отладки была прекращена некоторое время назад. Я нашел DebugDiag от Microsoft. (Дополнительная загрузка.) Отладка? Может быть, он поддерживает просмотр файлов в HEX? Поставляется в виде файла .MSI. Требуется пароль администратора для установки. Я не один
Шеннон Северанс
@Ken Я уже использовал head -c4096 bigFileName > smallFileNameLinux для получения первых 4 КБ файлов. Строки настолько малы, что четыре КБ имеют много строк для моих целей
Шеннон Северанс
Так почему бы не использовать hexdump -Cна Linux?
Кен
3
Отладка @Shannon является частью DOS, и поэтому, если вы используете x64, ее там нет.
kinokijuf
6

HxD - это переносимый шестнадцатеричный редактор, который не требует установки и представляет собой не что иное, как отдельный exe-файл.

http://mh-nexus.de/en/hxd/

Другим аналогичным переносимым вариантом является Frhed:

http://frhed.sourceforge.net/en/screenshots/

Джей Салливан
источник
Приятно иметь - Существуют устанавливаемые и портативные версии.
августа
5

Поскольку Windows 7 поставляется со встроенной платформой dotnet 3.5, у вас будет встроенный компилятор C #, так что вы можете получить, например, список из http://illegalargumentexception.blogspot.co.uk/2008/04/c- файл-hex-dump-application.html, а затем скомпилировать с помощью

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

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

sgmoore
источник
Просто, и нет необходимости в гигантской загрузке.
живи-люби
2

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

sgmoore
источник
Не идеально, но я смог сделать это, создав файл размером 0x00 байт, а затем сравнить с этим. Будучи текстовым файлом, который я просматривал, и который меня интересовал 0a и 0d, в основном это файл нулей, поскольку сравнение работало. Но он не обеспечивает как вид персонажа, так и вид в шестнадцатеричном виде, что делает поиск того, где я хотел выглядеть сложнее. (Как отладка в ответе Скотта, так и в hexl-режиме Emacs. Я не просил параллельного просмотра, но это очень важно для того, как я на самом деле использую шестнадцатеричные дампы.)
Shannon Severance
2

Вы можете использовать функцию 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   ????????????????
JamieSee
источник
Или просто используйте имя файла 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)".
Michaelangel007
источник