28

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

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

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

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

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

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

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

ОБНОВИТЬ

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

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

11 ответов11

25

Встроенный, быстрый и грязный: запустите 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 под названием list.exe . Это небольшой редактор с шестнадцатеричным режимом. Разработан специально для работы с большими файлами:

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

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

14

Если у вас есть 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.
10

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

6

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

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

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

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

6

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

DEBUG your_filename

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

D введите

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

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

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

D адрес 1 адрес 2 введите

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

D address L num 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
-
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 символы.

4

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

certutil -encodehex MyProgram.exe MyProgram.txt

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

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

2

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

1

Вы можете использовать функцию PowerShell, приведенную ниже, вместе с Get-Content, чтобы увидеть шестнадцатеричный код содержимого файла, т. Get-Content -Encoding Byte 'MyFile.bin' | Get-HexDump . Для выгрузки файла размером 222 КБ требуется около 23 секунд, и при желании выходные данные можно перенаправить в текстовый файл, чтобы упростить проверку дампа.

function Get-HexDump
{
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [byte[]] $Bytes,
        [Parameter(ValueFromPipeline = $false)]
        [string] $Encoding
    )

    BEGIN
    {
        if ([string]::IsNullOrEmpty($Encoding) -eq $true)
        {
            $Encoding = "ascii"
        }

        if ($Encoding -inotin [System.Text.Encoding]::GetEncodings().Name + "ascii" + "unicode")
        {
            Throw New-Object ArgumentException("Encoding must be $([System.Text.Encoding]::GetEncodings().Name -join ", "), unicode, or ascii.", '$Encoding')
        }

        $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)
            {
                $bufferChars = $displayEncoding.GetChars($buffer);
                $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { "." } else { "$_" } }) -join "")
                $hexRow += "$($hexValue)   $($bufferText)"
                $hexRow
            }
            else
            {
                $hexRow += "$($hexValue) "
            }

            $counter++
        }
    }

    END
    {
        $counter--

        if ($counter % 16 -ne 15)
        {
            $hexRow += " " * (((16 - $counter % 16) * 3) - 1)
            $bufferChars = $displayEncoding.GetChars($buffer);
            $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { "." } else { "$_" } }) -join "")
            $hexRow += "$($bufferText)"
            $hexRow
        }
    }
}

Вывод выглядит так:

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

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

HexViewer

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .