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

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

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

Je crois que le problème se situe 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 EOL du fichier.

Comment puis-je visualiser le “binaire” d'un fichier en utilisant un élément intégré à Windows 7 ? Je préfère éviter d'avoir à télécharger quoi que ce soit de plus.

(1) Mon collègue et moi avons ouvert le fichier dans des éditeurs de texte, et ils affichent les lignes comme on peut s'y attendre. Mais les deux éditeurs de texte ouvrent des fichiers avec des conventions de fin de vie différentes et les interprètent automatiquement. (TextEdit et Emacs 24.2. Pour Emacs, j'avais créé un second fichier avec seulement les 4 premiers octets en utilisant head -c4096 sur une boîte linux et je l'ai ouvert depuis ma boîte windows.

J'ai essayé d'utiliser le mode hexl dans Emacs, mais quand je suis passé en mode hexl et que je suis revenu en mode texte, le contenu du tampon avait changé, ajoutant un ^M visible à la fin de chaque ligne, donc je ne fais pas confiance à cela pour le moment.

Je crois que le problème se situe peut-être dans le(s) caractère(s) de fin de ligne utilisé(s). Les éditeurs, mon collègue et moi, avons essayé (1) de reconnaître automatiquement la convention de fin de ligne et de nous montrer les lignes. Et d'après d'autres preuves, je crois que la convention de fin de ligne est le retour chariot uniquement. (2) retour seulement.

Pour savoir ce qui se trouve réellement dans le fichier, j'aimerais regarder le contenu binaire du fichier, ou au moins quelques milliers d'octets du fichier, de préférence en Hex, bien que je puisse travailler en décimal ou en octal. Des zéros et des uns seulement seraient assez grossiers à regarder.

MISE À JOUR

Sauf celle qui suggère DEBUG, toutes les réponses ci-dessous fonctionnent dans une certaine mesure. Je les ai toutes notées comme étant utiles. Ma question était mal formulée. En testant chaque solution suggérée, j'ai trouvé que je voulais vraiment que les hexadécimaux et les contenus textuels soient affichés côte à côte, et que je voulais que, lorsque mon curseur se trouve sur quelque chose, que ce soit une valeur d'octet ou le caractère du texte, la chose correspondante de l'autre côté soit mise en évidence.

En fait, j'ai résolu mon problème lorsque le mode hexadécimal d'Emacs a commencé à fonctionner “correctement”. J'ai donc fini par n'utiliser aucune de ces réponses, seulement les tester (je devrais vraiment étudier le comportement bizarre d'Emacs et faire un rapport de bogue).

Réponses (11)

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

Si vous disposez de la version 5.0 ou d'une version ultérieure de powerhell, vous pouvez utiliser la fonction intégrée powershell

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

Intégré, rapide et sale : démarrer powershell, exécuter :

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

TotalCount est le nombre d'octets que vous voulez lire dans le fichier.

Google ‘powerhell hexdump’ pour obtenir des versions beaucoup plus soignées et fonctionnelles.

Si vous disposez des outils du kit de ressources Windows (pas exactement intégrés, mais proches), vous pouvez également utiliser un utilitaire de ligne cmd appelé list.exe. Il s'agit d'un petit éditeur avec mode hexadécimal. Il est conçu spécialement pour travailler avec des fichiers volumineux :

List Text File Tool (List) est un outil en ligne de commande qui permet d'afficher et de rechercher un ou plusieurs fichiers texte. Contrairement aux autres outils d'affichage de texte, List ne lit pas le fichier entier en mémoire lorsque vous l'ouvrez. Il permet à un utilisateur de modifier un fichier texte dans un format hexadécimal.

List est utile pour afficher des fichiers texte ou des fichiers journaux à distance, et pour une utilisation sur des serveurs lorsque les administrateurs sont préoccupés par la dégradation des performances du système.

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

Vous avez besoin d'un “éditeur hexadécimal”. J'utilise “Hex Editor Neo” depuis des années et il est très bon. Il est disponible en versions gratuite et payante . (Et je suis sûr qu'il y a d'autres outils similaires disponibles).

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

Cela fonctionne également sur tout ce qui est postérieur à XP :

certutil -encodehex MyProgram.exe MyProgram.txt

XP nécessite le Pack d'outils d'administration Windows Server 2003 d'ici : https://www.microsoft.com/en-us/download/details.aspx?id=16770

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

Copiez le fichier vers un nom avec une extension .COM, où le nom de base ne dépasse pas huit caractères.&nbsp ; Exécutez

DEBUG votre_nomdefichier

Il donnera une invite ‘ -’.&nbsp ; Tapez

DEntrer

à plusieurs reprises dans d isplay the file 128 bytes at a time. &nbsp ; Tapez

D address Entrez

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

D address1 address2 Entrez

pour afficher de address1 à address2. &nbsp ; Tapez

D adresse Lnum Entrez

pour afficher num octets (longueur) à partir de address.&nbsp ; num est également entré dans hex.&nbsp ; Utilisez Q pour quitter.

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
-
6
6
6
2014-02-12 22:39:12 +0000

HxD est un éditeur hexadécimal portable, ce qui signifie qu'aucune installation n'est nécessaire, et n'est rien d'autre qu'un simple fichier exe. http://mh-nexus.de/en/hxd/

Une autre option tout aussi portable est Frhed : http://frhed.sourceforge.net/en/screenshots/

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

Comme Windows 7 est livré avec le framework dotnet 3.5 intégré, vous aurez le compilateur C# intégré, donc vous pouvez prendre, par exemple, la liste de http://illegalargumentexception.blogspot.co.uk/2008/04/c-file-hex-dump-application.html et ensuite compiler en utilisant

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

et vous devriez vous retrouver avec un printhex.exe qui devrait afficher à la fois les caractères hex et ascii.

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

Ce n'est pas l'idéal, mais si vous ne voulez vraiment rien télécharger, alors vous pouvez essayer d'utiliser fc /b (c'est-à-dire comparer des 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. Vous obtiendrez peut-être des valeurs qui se trouvent être les mêmes dans les deux fichiers et qui peuvent donc être sautées de la sortie, mais vous pouvez savoir si cela se produit en vérifiant les valeurs manquantes dans la colonne de décalage.

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

Vous pouvez utiliser la fonction PowerShell ci-dessous ainsi que Get-Content pour voir le contenu du fichier en format hexadécimal, c'est-à-dire Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Il faut environ 23 secondes pour vider un fichier de 222 Ko et, si vous le souhaitez, la sortie peut être redirigée vers un fichier texte pour faciliter l'examen de la vidange.

$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

La sortie 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 ????????????????
1
1
1
2017-05-04 12:26:00 +0000

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

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

Je sais que vous utilisez Emacs mais Vim les utilisateurs peuvent utiliser xxd utilitaire :

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

i.e.

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