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

Hoe kan ik de binaire inhoud van een bestand bekijken in Windows 7? (Is het mogelijk.)

Ik heb een bestand, iets groter dan 500MB, dat wat problemen veroorzaakt.

Ik denk dat het probleem zit in de conventie voor het einde van de regel (EOL). Ik zou graag het bestand in zijn ongeïnterpreteerde onbewerkte vorm (1) willen bekijken om de EOL-conventie van het bestand te bevestigen.

Hoe kan ik de “binary” van een bestand bekijken met iets dat ingebouwd is in Windows 7? Ik zou liever vermijden dat ik iets extra’s moet downloaden.

(1) Mijn collega en ik openden het bestand in tekst editors, en zij tonen de regels zoals je zou verwachten. Maar beide tekst editors openen bestanden met verschillende EOL conventies en interpreteren die automatisch. (TextEdit en Emacs 24.2. Voor Emacs had ik een tweede bestand gemaakt met alleen de eerste 4K bytes met head -c4096 op een Linux box en opende dat vanaf mijn Windows box.

Ik heb geprobeerd om hexl-mode te gebruiken in Emacs, maar toen ik naar hexl-mode ging en weer terug naar text-mode, was de inhoud van de buffer veranderd, en voegde een zichtbare ^M toe aan het eind van elke regel, dus dat vertrouw ik op dit moment niet.

Ik denk dat het probleem zit in de gebruikte eindteken(s). De editor die mijn collega en ik probeerden (1) herkende automatisch de conventie voor het einde van de regel en liet ons regels zien. En gebaseerd op ander bewijs geloof ik dat de EOL conventie alleen carriage return is. (2) alleen return.

Om te weten wat er werkelijk in het bestand staat, zou ik de binaire inhoud van het bestand willen zien, of tenminste een paar duizend bytes van het bestand, bij voorkeur in Hex, hoewel ik ook met decimaal of octaal zou kunnen werken. Alleen enen en nullen zou vrij grof zijn om naar te kijken.

UPDATE

Behalve het antwoord dat DEBUG suggereert, werken alle onderstaande antwoorden in meer of mindere mate. Ik heb ze allemaal als nuttig bestempeld. Mijn vraag was niet goed geformuleerd. Bij het testen van elke voorgestelde oplossing ontdekte ik dat ik echt hex- en tekstinhoud naast elkaar wilde zien, en dat ik iets wilde waarbij wanneer ik mijn cursor ergens op had staan, ofwel een bytewaarde of een tekstteken, het overeenkomende ding aan de andere kant zou worden gemarkeerd.

Ik loste mijn probleem eigenlijk op toen Emacs hexl-mode “correct” begon te werken. Dus ik heb uiteindelijk geen van deze antwoorden gebruikt, alleen maar getest. (Ik zou echt het vreemde gedrag van Emacs moeten onderzoeken en een bug-report indienen).

Antwoorden (11)

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

Als je powershell versie 5.0 of hoger hebt, kun je de powershell ingebouwde functie 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

Ingebouwd, quick and dirty: start powershell, execute:

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

TotalCount is het aantal bytes dat je uit het bestand wilt lezen.

Google ‘powershell hexdump’ om veel meer gepolijste/werkbare versies te krijgen.

Als je Windows Resource Kit Tools hebt (niet helemaal ingebouwd, maar komt in de buurt), kun je ook een cmd line hulpprogramma gebruiken, genaamd list.exe. Het is een kleine editor met hex mode. Speciaal ontworpen om met grote bestanden te werken:

List Text File Tool (List) is een command-line hulpprogramma dat een of meer tekstbestanden weergeeft en doorzoekt. In tegenstelling tot andere tekstweergavetools, leest List niet het hele bestand in het geheugen wanneer u het opent. Het stelt een gebruiker in staat een tekstbestand te bewerken in een hexadecimaal formaat.

List is nuttig om tekst- of logbestanden op afstand weer te geven, en voor gebruik op servers waar beheerders zich zorgen maken over degradatie van systeemprestaties.

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

Je hebt een “hex editor” nodig. Ik gebruik “Hex Editor Neo” al jaren en het is erg goed. Het is beschikbaar in gratis en betaalde versies . (En ik ben er zeker van dat er andere gelijkaardige programma’s beschikbaar zijn).

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

Dit werkt ook op alles na XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP vereist het Windows Server 2003 Administration Tools Pack van hier : https://www.microsoft.com/en-us/download/details.aspx?id=16770

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

Kopieer het bestand naar een naam met een extensie .COM, waarbij de basisnaam niet langer is dan acht tekens.  Voer

DEBUG uwfilenaam_

Het zal een ‘ -’ prompt geven.  Type

DEnter

herhaaldelijk om d isplay het bestand 128 bytes per keer te tonen.   Type

D address Voer

in om 128 bytes weer te geven vanaf address, dat in hex moet worden getypt, waarbij het begin van het bestand adres 100 is.  Type

D address1 address2 Voer

in om van address1 tot address2 weer te geven.   Typ

D address Lnum Typ

om num bytes (lengte) weer te geven, beginnend bij addressnum wordt ook in hex ingevoerd.  Gebruik Q om te stoppen.

Bijvoorbeeld,

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 is een draagbare hex-editor, wat betekent dat geen installatie nodig is, en is niets meer dan een enkel exe-bestand. http://mh-nexus.de/en/hxd/

Een andere, vergelijkbare portable optie is Frhed: http://frhed.sourceforge.net/en/screenshots/

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

Aangezien Windows 7 wordt geleverd met het dotnet framework 3.5 ingebouwd, heb je de C# compiler ingebouwd, dus je kunt bijvoorbeeld de listing van http://illegalargumentexception.blogspot.co.uk/2008/04/c-file-hex-dump-application.html pakken en dan compileren met

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

en je zou moeten eindigen met een printhex.exe die zowel hex als ascii tekens zou moeten weergeven.

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

Het is niet ideaal, maar als je echt niets wilt downloaden, dan kun je proberen met fc /b (d.w.z. bestandsvergelijking in binaire modus) om dit bestand te vergelijken met een ander, compleet ander bestand, en het zal je de hex-waarden laten zien van elke byte die verschilt. Het kan zijn dat sommige waarden hetzelfde zijn in de twee bestanden en dus worden overgeslagen in de uitvoer, maar je kunt zien of dat gebeurt door te controleren op ontbrekende waarden in de offset kolom.

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

Je kunt de PowerShell functie hieronder gebruiken samen met Get-Content om een hexdump te zien van de inhoud van het bestand, d.w.z., Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Het duurt ongeveer 23 seconden om een 222 KB bestand te dumpen en, indien gewenst, kan de uitvoer worden omgeleid naar een tekstbestand om het onderzoeken van de dump te vergemakkelijken.

$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

De output ziet er als volgt uit:

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

Omdat Sublime Text mijn favoriete editor is, gebruik ik de plugin om hex bestanden te bekijken. http://facelessuser.github.io/HexViewer/

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

Ik weet dat je Emacs gebruikt, maar Vim gebruikers kunnen het xxd hulpprogramma gebruiken:

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

d.w.z.

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