Як я можу переглядати двійковий вміст файлу у Windows 7? (Це можливо.)


35

У мене файл, трохи більший за 500 Мб, що спричиняє деякі проблеми.

Я вважаю, що проблема полягає у використанні конвенції EOL. Я хотів би подивитися на файл у його неінтерпретованому сировинному вигляді (1), щоб підтвердити конвенцію EOL про файл.

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

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

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

Я вважаю, що проблема може бути в кінці використаних символів рядка. Редактори, які ми з колегою намагалися (1), просто автоматично розпізнали кінець конвенції і показали нам рядки. І, грунтуючись на інших доказах, я вважаю, що конвенція EOL - це лише повернення перевезення. (2) лише повернення.

Щоб знати, що насправді є у файлі, я хотів би подивитися на двійковий вміст файлу або, принаймні, пару тисяч байт файлу, бажано в шістнадцятковій формі, хоча я міг би працювати з десятковою чи восьмою. Тільки на нулі було б досить грубо подивитися.

ОНОВЛЕННЯ

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

Я фактично вирішив свою проблему, коли шестигранний режим Emacs почав працювати «правильно». Тому я не використовував жодної з цих відповідей, а лише перевіряв їх. (Дійсно, слід вивчити дивну поведінку Emacs та подати звіт про помилки.)


Ймовірно, є якийсь інструмент під Cygwin, але для цього знадобиться встановити Cygwin. Або якщо у вас, наприклад, у вашому вікні встановлена ​​Java, було б досить простою задачею написати шістнадцяткову дамп-програму на Java.
Даніель Р Хікс

Відповіді:


11

Вам потрібен «шестигранний редактор». Я використовував "Hex Editor Neo" протягом багатьох років, і це дуже добре. Він доступний у безкоштовних та платних версіях . (І я впевнений, що є інші подібні інструменти.)


4
Я запитав, як, окрім Windows 7, тому що мені не подобається додавати додаткові програми, тому що 1) Багато хто встановлює таким чином, що права, які я маю, не дозволяють. 2) Дехто виглядає хитрим. Це сказав, що редактор Hex Neo виглядає гарною рекомендацією. +1
Shannon Severance

1
zblist.com - це окрема програма, на яку не потрібно встановлювати або потребувати спеціальних прав та має режим Alt-H або hex
sgmoore

Виконав усі мої вимоги, включаючи заявлене, невідоме, невідоме. Шестигранний редактор Neo також був швидким, і його додали в мій пакет інструментів.
Шеннон Северанс

1. Інші редактори не є рідними. 2. Менеджери файлів хороші для цієї мети, а навколо є багато портативних. 3. Команда типу може відображати вміст в оригіналі та має корисні фільтри (наприклад, сторінка за сторінкою).
Перемогу

37

Якщо у вас є версія shell 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.

4
Я відверто здивований, що це не найкраща відповідь. Це правильний спосіб зробити це за допомогою вбудованого інструменту у Windows. Якщо ви хочете написати вихід у файл, ви можете скористатись> Format-Hex application.exe> ​​out.txt
techdude

Це здається приємним, але Format-Hexвоно недоступне в моєму PowerShell; Я просто отримую помилку "не визнано"
Kidburla

За словами JamieSee, він, мабуть, не був доданий до моменту опрацювання 5.0.
техдуд

26

Вбудований, швидкий і брудний: запуск powershell, виконання:

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

TotalCount - це кількість байтів, які ви хочете прочитати з файлу.

Google 'повноваження hexdump', щоб отримати набагато більш відшліфовані / працездатні версії.

Якщо у вас є Інструменти набору ресурсів Windows (не зовсім вбудовані, але закриті), ви також можете скористатися утилітою cmd, що називається list.exe. Це невеликий редактор з шестигранним режимом. Розроблено спеціально для роботи з великими файлами:

Інструмент списку текстових файлів (список) - це інструмент командного рядка, який відображає та здійснює пошук одного або декількох текстових файлів. На відміну від інших інструментів відображення тексту, List не зчитує весь файл у пам'яті під час відкриття. Це дозволяє користувачеві редагувати текстовий файл у шістнадцятковому форматі.

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


1
Поки що це рішення є найближчим, про що я просив.
Шеннон Северанж

1
Гарний, простий, вже встановлений. Я змінив формат на запис-хост ("{0: X2}"), щоб змусити 0x0A відображатись як "0A", а не "A", 2-х з двозначною верхньою
літерою,

1
List.exe був ідеальним - команда list.exe /?довідки не дає великої кількості інформації, але потрапивши всередину редактора просто натисніть, ?щоб побачити команди. Hвідкриває шестигранний редактор і F1перемикає спосіб відображення Hex
Coruscate5

7

Це також працює на все після XP:

certutil -encodehex MyProgram.exe MyProgram.txt

Тут потрібен пакет інструментів адміністрування Windows Server 2003:

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


Найбільш портативне та зворотне порівнянне рішення для Windows, його можна було використовувати навіть із пакетних сценаріїв Windows, вражений, чому це все ще не в першу чергу на всі відповіді
Андрій

6

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

DEBUG ваше ім’я_файлу

Це дасть -підказку ' '. Тип

DEnter

Повторно d вантажують файл 128 байт за один раз. Тип

D адреса Enter

відобразити 128 байт, починаючи з адреси , яка повинна бути введена шістнадцятковою формою, де початок файлу має адресу 100. Введіть

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

відобразити з адреси 1 до адреси 2 . Тип

D адреса LNum Enter

для відображення Num байт (довжина) , починаючи з адреси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 (Він повинен поміститися в сегменті, починаючи з компенсації 100 год.)
Кен

1
C:\>attrib debug.exe /s. Результати: File not found - debug.exe. Не вдалося знайти офіційного, налагодження більше не підтримується заявою, але з того, що я бачив в Інтернеті, схоже, що підтримка налагодження була відкинута деякий час тому. Я знайшов DebugDiag від Microsoft. (Додаткове завантаження.) Налагодження? Можливо, він підтримує перегляд файлів у HEX? Поставляється у форматі .MSI. Для встановлення потрібен пароль адміністратора. Я не одна.
Шеннон Северанж

@Ken Я вже використовував head -c4096 bigFileName > smallFileNameLinux, щоб отримати перші 4 КБ файлів. Рядки досить малі, що у чотирьох КБ є безліч рядків для моїх цілей
Shannon Severance

То чому б не використовувати hexdump -Cпід час роботи в Linux?
Кен

3
Налагодження @Shannon є частиною DOS, і, якщо ви використовуєте x64, її там немає.
kinokijuf


5

Оскільки 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 символ.


Просте та не потребує гігантського завантаження.
live-love

2

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


Не ідеально, але мені вдалося це зробити, створивши файл розміром 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   ????????????????

Або просто скористайтеся формат-шістнадцятковою назвою файлу
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)".
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.