52 votes

Comment visualiser le contenu binaire d'un fichier en mode natif sous Windows 7 (est-ce possible) ?

J'ai un fichier d'un peu plus de 500 Mo qui pose des problèmes.

Je pense que le problème réside dans la convention de fin de ligne (EOL) utilisée. J'aimerais examiner le fichier dans sa forme brute non interprétée (1) pour confirmer la convention de fin de ligne du fichier.

Comment puis-je voir le "binaire" d'un fichier en utilisant quelque chose d'intégré à Windows 7 ? Je préférerais ne pas avoir à télécharger quoi que ce soit d'autre.

(1) Mon collègue et moi-même avons ouvert le fichier dans des éditeurs de texte, qui affichent les lignes comme on pourrait s'y attendre. Mais les deux éditeurs de texte ouvrent des fichiers avec des conventions EOL différentes et les interprètent automatiquement. (TextEdit et Emacs 24.2. Pour Emacs, j'ai créé un deuxième fichier avec seulement les 4 premiers octets en utilisant head -c4096 sur une machine linux et l'a ouvert depuis ma machine Windows.

J'ai essayé d'utiliser le mode hexl dans Emacs, mais lorsque je suis passé au mode hexl et revenu au mode texte, le contenu du tampon avait changé, ajoutant un ^M visible à la fin de chaque ligne, donc je ne m'y fie pas pour l'instant.

Je pense que le problème réside dans le(s) caractère(s) de fin de ligne utilisé(s). Les éditeurs que mon collègue et moi avons essayés (1) reconnaissaient automatiquement la convention de fin de ligne et nous montraient des lignes. Et d'après d'autres éléments, je pense que la convention de fin de ligne est le retour chariot uniquement. (2) retour uniquement.

Pour savoir ce que contient réellement le fichier, j'aimerais examiner le contenu binaire du fichier, ou au moins quelques milliers d'octets du fichier, de préférence en hexadécimal, bien que je puisse travailler avec du décimal ou de l'octal. Uniquement des uns et des zéros seraient assez grossiers à regarder.

MISE À JOUR

Sauf celle qui suggère DEBUG Toutes les réponses ci-dessous fonctionnent dans une certaine mesure. J'ai ajouté une note à chacune d'entre elles pour indiquer qu'elles étaient utiles. Ma question était mal formulée. En testant chaque solution suggérée, je me suis rendu compte que je voulais vraiment que les contenus hexadécimaux et textuels soient affichés côte à côte, et que lorsque j'avais le curseur sur quelque chose, que ce soit une valeur d'octet ou un caractère textuel, la chose correspondante de l'autre côté était mise en surbrillance.

J'ai en fait résolu mon problème lorsque le mode hexl d'Emacs a commencé à fonctionner "correctement". J'ai donc fini par n'utiliser aucune de ces réponses, me contentant de les tester (je devrais vraiment enquêter sur le comportement bizarre d'Emacs et déposer un rapport de bogue).

7voto

Rifkin Habsburg Points 461

HxD est un éditeur hexagonal portable, ce qui signifie qu'aucune installation n'est nécessaire et qu'il ne s'agit que d'un simple fichier exe.

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

Frhed est une autre option tout aussi portable :

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

6voto

Scott Points 20468

Copier le fichier dans un nom avec un .COM lorsque le nom de base ne comporte pas plus de huit caractères. Exécuter

DEBUG votre_nom_de_fichier

Il donnera un ' - ' prompt. Type de texte

DEnter

à plusieurs reprises à d affiche le fichier 128 octets à la fois. Type de fichier

D adresse Enter

pour afficher 128 octets à partir de adresse qui doit être tapé en hexadécimal, où le début du fichier est l'adresse 100. Type de fichier

D adresse 1 adresse 2 Enter

à afficher à partir de adresse 1 à adresse 2 . Type

D adresse L num. Enter

pour afficher num. octets (longueur) à partir de adressenum. est également saisie en hexadécimal. Utiliser Q de démissionner.

Par exemple,

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
-

3voto

jackrabbit Points 2990

Ce n'est pas l'idéal, mais si vous ne voulez vraiment pas télécharger quoi que ce soit, vous pouvez essayer d'utiliser fc /b (c'est-à-dire la comparaison de fichiers en mode binaire) pour comparer ce fichier avec un autre fichier complètement différent, et il vous montrera les valeurs hexadécimales de chaque octet qui est différent. Il se peut que certaines valeurs soient identiques dans les deux fichiers et ne soient donc pas prises en compte dans la sortie, mais vous pouvez savoir si cela se produit en vérifiant les valeurs manquantes dans la colonne offset.

2voto

Robert Points 11

Vous pouvez utiliser la fonction PowerShell ci-dessous avec Get-Content pour obtenir un extrait hexadécimal du contenu du fichier, c'est-à-dire, Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump . Le vidage d'un fichier de 222 Ko prend environ 23 secondes et, si vous le souhaitez, la sortie peut être redirigée vers un fichier texte pour faciliter l'examen du vidage.

$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

Le résultat ressemble à ceci :

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   ????????????????

1voto

Zuhayer Points 646

Sublime text étant mon éditeur préféré, j'utilise son plugin pour visualiser les fichiers hexagonaux. http://facelessuser.github.io/HexViewer/

HexViewer

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X