Wie kann ich den binären Inhalt einer Datei nativ in Windows 7 anzeigen? (Ist es möglich.)

35

Ich habe eine Datei, die etwas größer als 500 MB ist und einige Probleme verursacht.

Ich glaube, das Problem wird in der End-of-Line-Konvention (EOL) verwendet. Ich möchte die Datei in ihrer nicht interpretierten Rohform (1) betrachten, um die EOL-Konvention der Datei zu bestätigen.

Wie kann ich die "Binärdatei" einer Datei mit einer in Windows 7 integrierten Funktion anzeigen? Ich würde es vorziehen, keine zusätzlichen Dateien herunterladen zu müssen.

(1) Mein Kollege und ich haben die Datei in Texteditoren geöffnet und sie zeigen die Zeilen wie erwartet an. Beide Texteditoren öffnen jedoch Dateien mit unterschiedlichen EOL-Konventionen und interpretieren sie automatisch. (TextEdit und Emacs 24.2. Für Emacs hatte ich unter Verwendung head -c4096einer Linux-Box eine zweite Datei mit nur den ersten 4 KB erstellt und diese in meiner Windows-Box geöffnet.

Ich habe versucht, den Hexl-Modus in Emacs zu verwenden, aber als ich in den Hexl-Modus und zurück in den Text-Modus gewechselt bin, hatte sich der Inhalt des Puffers geändert und am Ende jeder Zeile ein sichtbares ^ M hinzugefügt, was ich nicht bin Ich vertraue dem im Moment.

Ich glaube, das Problem liegt möglicherweise am Ende der verwendeten Zeilenzeichen. Die Redakteure, mein Kollege und ich, haben versucht (1), die End-of-Line-Konvention automatisch zu erkennen und uns die Zeilen zu zeigen. Und basierend auf anderen Beweisen glaube ich, dass die EOL-Konvention nur die Rückgabe von Waren beinhaltet. (2) nur zurück.

Um zu wissen, was sich tatsächlich in der Datei befindet, möchte ich den binären Inhalt der Datei oder mindestens ein paar tausend Bytes der Datei betrachten, vorzugsweise in hexadezimaler Schreibweise, obwohl ich mit dezimal oder oktal arbeiten könnte. Nur Einsen und Nullen wären ziemlich grob anzusehen.

AKTUALISIEREN

Mit Ausnahme des einen Vorschlags DEBUGfunktionieren alle unten stehenden Antworten in gewissem Maße. Ich habe jede davon als hilfreich eingestuft. Meine Frage war schlecht formuliert. Beim Testen der einzelnen Lösungsvorschläge stellte ich fest, dass ich wirklich wollte, dass Hexadezimal- und Textinhalte nebeneinander angezeigt werden und dass ich wollte, dass sich der Cursor über etwas befindet, entweder über einen Bytewert oder über das Textzeichen, das auf dem übereinstimmt Die andere Seite wird hervorgehoben.

Ich habe mein Problem tatsächlich gelöst, als der Emacs Hexl-Modus "richtig" lief. Also habe ich keine dieser Antworten benutzt, sondern sie nur getestet. (Sollte wirklich das seltsame Verhalten des Emacs untersuchen und einen Fehlerbericht einreichen.)

Shannon Severance
quelle
Wahrscheinlich gibt es unter Cygwin irgendeine Art von Tool, aber dafür müsste Cygwin installiert werden. Oder wenn Sie zB Java auf Ihrer Box installiert haben, wäre es eine ziemlich einfache Aufgabe, ein Hex-Dump-Programm in Java zu schreiben.
Daniel R Hicks

Antworten:

11

Sie benötigen einen "Hex-Editor". Ich benutze "Hex Editor Neo" seit Jahren und es ist sehr gut. Es ist in kostenlosen und kostenpflichtigen Versionen erhältlich . (Und ich bin mir sicher, dass es ähnliche Tools gibt.)

Daniel R Hicks
quelle
4
Ich hatte gefragt, wie, ohne irgendetwas außer Windows 7, weil ich nicht gerne zusätzliche Programme hinzufüge, weil 1) Viele auf eine Weise installieren, die die Rechte, die ich habe, nicht zulassen. 2) Manche sehen zweifelhaft aus. Der Hex Editor Neo scheint eine gute Empfehlung zu sein. +1
Shannon Severance
1
zblist.com ist ein eigenständiges Programm, das nicht installiert werden muss oder besondere Rechte benötigt und einen Alt-H- oder Hex-Modus hat
sgmoore
Erfüllte alle meine Anforderungen, einschließlich angegeben, falsch angegeben, nicht angegeben. Hex Editor Neo war auch schnell und wurde meiner Werkzeugtasche hinzugefügt.
Shannon Severance
1. Andere Editoren sind nicht native. 2. Dateimanager sind für diesen Zweck gut geeignet, und es gibt viele tragbare Dateimanager. 3. Der Befehl Typ kann den Inhalt nativ anzeigen und verfügt über nützliche Filter (wie Seite für Seite).
Overmind
37

Wenn Sie über eine Powershell-Version 5.0 oder höher verfügen, können Sie die powershellintegrierte Funktion verwendenFormat-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
quelle
4
Ich bin ehrlich gesagt überrascht, dass dies nicht die beste Antwort ist. Dies ist DER richtige Weg, dies mit einem in Windows integrierten Tool zu tun. Wenn Sie die Ausgabe in eine Datei schreiben möchten, können Sie> Format-Hex application.exe> ​​out.txt
techdude
Dies scheint nett zu sein, Format-Hexist aber in meiner PowerShell nicht verfügbar. Ich bekomme nur einen "nicht erkannten" Fehler
Kidburla
Laut JamieSee wurde es offenbar erst mit Powershell 5.0 hinzugefügt.
Techdude
26

Eingebaut, schnell und schmutzig: Starten powershell, Ausführen:

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

TotalCount ist die Anzahl der Bytes, die Sie aus der Datei lesen möchten.

Google 'Powershell Hexdump', um besser funktionierende Versionen zu erhalten.

Wenn Sie über Windows Resource Kit-Tools verfügen (nicht genau integriert, aber geschlossen), können Sie auch ein Dienstprogramm namens cmd line verwenden list.exe. Es ist ein kleiner Editor mit Hex-Modus. Speziell für die Arbeit mit großen Dateien entwickelt:

List Text File Tool (List) ist ein Befehlszeilenprogramm, mit dem eine oder mehrere Textdateien angezeigt und durchsucht werden. Im Gegensatz zu anderen Textanzeigetools liest List beim Öffnen nicht die gesamte Datei in den Speicher. Es ermöglicht einem Benutzer, eine Textdatei in einem hexadezimalen Format zu bearbeiten.

List ist nützlich, um Text- oder Protokolldateien remote anzuzeigen und auf Servern zu verwenden, auf denen Administratoren eine Beeinträchtigung der Systemleistung befürchten.

wmz
quelle
1
Bisher ist diese Lösung die Lösung, nach der ich am nächsten gekommen bin.
Shannon Severance
1
Schön, einfach, bereits installiert. Ich änderte das Format write-host ( „{0: X2}“ 0x0A zu zwingen , als „0A“ nicht „A“ angezeigt werden , die 2 für 2 - stellige des obere Fall , weil das ist , wie ich mag es
Adam Straughan
1
List.exe war perfekt - der Hilfebefehl list.exe /?gibt nicht viele Informationen, aber wenn Sie sich im Editor befinden, drücken Sie einfach ?, um die Befehle anzuzeigen . HÖffnet den Hex-Editor und F1schaltet die Darstellung des Hex um
Coruscate5
7

Dies funktioniert auch auf allen anderen Rechnern nach XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP benötigt das Windows Server 2003 Administration Tools Pack von hier:

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

Funken
quelle
Die portabelste und rückwärtskompatibelste Lösung für Windows, die sogar mit Windows-Batch-Skripten verwendet werden kann. Erstaunt, warum dies immer noch nicht in allen Antworten enthalten ist
Andry,
6

Kopieren Sie die Datei in einen Namen mit einer .COMErweiterung, bei der der Basisname nicht länger als acht Zeichen ist. Lauf

DEBUG Ihr_Dateiname

Es wird eine -Eingabeaufforderung geben. Art

DEnter

wiederholt, um die Datei 128 Bytes auf einmal anzuzeigen. Art

D Adresse Enter

um 128 Bytes ab der Adresse anzuzeigen , die hexadezimal eingegeben werden muss, wobei der Dateianfang die Adresse 100 ist. Geben Sie ein

D Adresse 1 Adresse 2 Enter

Anzeige von Adresse 1 bis Adresse 2 . Art

D Adresse Lnum Enter

um die Anzahl der Bytes (Länge) beginnend mit der Adresse anzuzeigen .  num wird auch hexadezimal eingegeben. Verwenden Sie Qzu beenden.

Beispielsweise,

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
-
Scott
quelle
3
Leider funktioniert das nicht, wenn die Datei größer als 64 KB ist, das Maximum für eine .COM-Datei. (Es muss ab 100h Offset in das Segment passen.)
Ken
1
C:\>attrib debug.exe /s. Ergebnisse: File not found - debug.exe. Konnte offizielles Debug nicht finden, wird nicht mehr unterstützt , aber von dem, was ich im Web gesehen habe, sieht es so aus, als ob der Debug-Support vor einer Weile eingestellt wurde. Ich habe DebugDiag von Microsoft gefunden. (Zusätzlicher Download.) Debuggen? Vielleicht unterstützt es das Betrachten von Dateien in HEX? Lieferung als .MSI-Datei. Benötigt ein Administratorkennwort zur Installation. Ich bin keiner.
Shannon Severance
@Ken Ich hatte bereits unter head -c4096 bigFileName > smallFileNameLinux benutzt, um die ersten 4 KB der Dateien zu bekommen. Die Zeilen sind klein genug, dass vier KB viele Zeilen für meine Zwecke haben
Shannon Severance
Warum also nicht hexdump -Cunter Linux?
Ken
3
Das @ Shannon-Debugging ist Teil von DOS. Wenn Sie x64 verwenden, ist es daher nicht vorhanden.
Kinokijuf
6

HxD ist ein portabler Hex-Editor, für den keine Installation erforderlich ist. Es handelt sich lediglich um eine einzelne Exe-Datei.

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

Eine andere ähnlich tragbare Option ist Frhed:

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

Jay Sullivan
quelle
Schön, dass es installierbare und portable Editionen gibt.
4.
5

Da Windows 7 mit dem integrierten Dotnet Framework 3.5 geliefert wird, ist der C # -Compiler bereits integriert, sodass Sie beispielsweise die Auflistung von http://illegalargumentexception.blogspot.co.uk/2008/04/c- abrufen können. file-hex-dump-application.html und kompiliere dann mit

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

und Sie sollten mit einer printhex.exe enden, die sowohl Hex- als auch ASCII-Zeichen anzeigen sollte.

sgmoore
quelle
Einfach und ohne großen Download.
Live-Liebe
2

Es ist nicht ideal, aber wenn Sie wirklich nichts herunterladen möchten, können Sie versuchen, diese Datei mit fc / b (dh Dateivergleich im Binärmodus) mit einer anderen, völlig anderen Datei zu vergleichen, und es wird Ihnen das Hex angezeigt Werte für jedes Byte, das unterschiedlich ist. Möglicherweise erhalten Sie Werte, die in den beiden Dateien identisch sind, und werden daher möglicherweise von der Ausgabe übersprungen. Sie können jedoch feststellen, ob dies der Fall ist, indem Sie in der Offset-Spalte nach fehlenden Werten suchen.

sgmoore
quelle
Nicht ideal, aber ich konnte dies tun, indem ich eine Datei mit 0x00 Bytes erstellte und sie dann damit verglich. Als Textdatei, die ich mir ansah und die mich für 0a und 0d interessierte, funktionierte meistens eine Datei mit Nullen als Vergleich. Aber es bietet nicht sowohl die Charakter- als auch die Hex-Ansicht nebeneinander, um herauszufinden, wo ich genauer hinschauen wollte. (Wie Debuggen in Scotts Antwort und wie Emacs 'Hexl-Modus. Ich hatte nicht nach Side-by-Side-View gefragt, aber es ist ziemlich wichtig, wie ich Hex-Dumps tatsächlich verwende.)
Shannon Severance
2

Sie können die PowerShell-Funktion unten zusammen mit Get-Content verwenden, um einen Hexdump des Dateiinhalts anzuzeigen, z Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Es dauert ungefähr 23 Sekunden, um eine 222-KB-Datei zu sichern. Falls gewünscht, kann die Ausgabe in eine Textdatei umgeleitet werden, um die Überprüfung der Sicherung zu vereinfachen.

$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

Die Ausgabe sieht folgendermaßen aus:

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
quelle
Oder verwenden Sie einfach Format-Hex-Dateiname
Techdude
@techdude Format-Hex ist nicht in allen Versionen von PowerShell verfügbar. Es ist in PowerShell 4 und früheren Versionen nicht vorhanden. Ich habe diesen Code geschrieben, bevor es Format-Hex überhaupt gab.
JamieSee
Wie kehre ich dies in die Binärdatei zurück?
Zimba
0

Ich weiß, dass Sie Emacs verwenden, aber Vim- Benutzer können das xxdDienstprogramm verwenden:

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

dh

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
quelle