Comment afficher le contenu binaire d'un fichier de manière native dans Windows 7? (C'est possible.)

33

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

Je crois que le problème est dans la convention de fin de ligne (EOL) utilisée. Je voudrais regarder le fichier dans sa forme brute non interprétée (1) pour confirmer la convention EOL du fichier.

Comment visualiser le "binaire" d'un fichier en utilisant quelque chose de construit dans Windows 7? Je préférerais éviter de télécharger des fichiers supplémentaires.

(1) Mon collègue et moi avons ouvert le fichier dans des éditeurs de texte et les lignes s'affichent comme on pourrait s'y attendre. Mais les deux éditeurs de texte ouvriront des fichiers avec différentes conventions EOL et les interpréteront automatiquement. (TextEdit et Emacs 24.2. Pour Emacs, j’avais créé un deuxième fichier contenant uniquement les 4 premiers octets utilisés head -c4096sur une boîte Linux et l’ouvrant à partir de ma boîte Windows.

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

Je pense que le problème peut concerner le ou les caractères de fin de ligne utilisés. Les éditeurs, mon collègue et moi-même avons essayé (1), ont simplement reconnu automatiquement la convention de fin de ligne et nous ont montré des lignes. Et sur la base d’autres preuves, je pense que la convention EOL ne concerne que le retour de voiture. (2) retour seulement.

Pour savoir ce qui est réellement dans le fichier, je voudrais 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 avec décimal ou octal. Des zéros ne seraient que difficiles à regarder.

METTRE À JOUR

À l’exception de celle suggérant DEBUG, toutes les réponses ci-dessous fonctionnent dans une certaine mesure. J'ai voté favorablement chacun de ceux-ci comme utiles. Ma question était mal formée. En testant chaque solution suggérée, je me suis rendu compte que je voulais vraiment voir côte à côte le contenu hexadécimal et textuel, et que je voulais que ce soit quelque chose où j’avais le curseur sur quelque chose, soit une valeur d’octet, soit le caractère du texte, l'autre côté serait mis en évidence.

J'ai en fait résolu mon problème quand le mode hexl d'Emacs a commencé à fonctionner "correctement". Donc, je n’ai utilisé aucune de ces réponses, je les ai seulement testées (il faudrait vraiment étudier le comportement étrange d’Emacs et déposer un rapport de bogue).

Shannon Severance
la source
Cygwin contient probablement une sorte d’outil, mais cela nécessiterait l’installation de Cygwin. Ou si vous avez, par exemple, Java installé sur votre machine, il serait assez simple d'écrire un programme de vidage hexadécimal en Java.
Daniel R Hicks

Réponses:

11

Vous avez besoin d'un "éditeur hexadécimal". J'ai utilisé "Hex Editor Neo" pendant des années et c'est très bien. Il est disponible en version gratuite et payante . (Et je suis sûr qu'il existe d'autres outils similaires disponibles.)

Daniel R Hicks
la source
4
J'avais demandé comment, sans autre chose que Windows 7, parce que je n'aime pas ajouter de programmes supplémentaires parce que 1) Beaucoup installent d'une manière que leurs droits ne me permettent pas. 2) Certains semblent être douteux. Cela dit, Hex Editor Neo semble être une bonne recommandation. +1
Shannon Severance
1
zblist.com est un programme autonome, qui n'a pas besoin d'être installé, ni de droits spéciaux, et qui est doté du mode Alt-H ou hexadécimal
sgmoore
Satisfait à toutes mes exigences, y compris déclaré, mal énoncé, non déclaré. Hex Editor Neo était aussi rapide et a été ajouté à ma trousse à outils.
Shannon Severance
1. Les autres éditeurs ne sont pas natifs. 2. Les gestionnaires de fichiers sont bons à cette fin et il y en a beaucoup qui sont portables. 3. La commande Type peut afficher le contenu de manière native et dispose de filtres utiles (comme page par page).
Overmind
30

Si vous avez la version PowerShell 5.0 ou ultérieure, vous pouvez utiliser la powershellfonction intégrée.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.
AzizSM
la source
3
Je suis franchement surpris que ce ne soit pas la meilleure des réponses. C’est LA manière correcte de le faire en utilisant un outil intégré à Windows. Si vous voulez écrire la sortie dans un fichier, vous pouvez utiliser> Format-Hex application.exe> ​​out.txt
techdude
Cela semble agréable, mais Format-Hexn’est pas disponible dans mon PowerShell; Je viens d'obtenir une erreur "non reconnue"
Kidburla
Selon JamieSee, il n'a apparemment pas été ajouté avant Powershell 5.0.
Techdude
26

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 souhaitez lire à partir d'un fichier.

"Powerhell hexdump" de Google pour obtenir des versions beaucoup plus polies / réalisables.

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 de commande appelé list.exe. C'est un petit éditeur en mode hexadécimal. Conçu spécifiquement pour travailler avec de gros fichiers:

Outil de liste de fichiers texte (List) est un outil de ligne de commande qui affiche et recherche un ou plusieurs fichiers texte. Contrairement à d'autres outils d'affichage de texte, List ne lit pas l'intégralité du fichier en mémoire lorsque vous l'ouvrez. Il permet à un utilisateur de modifier un fichier texte au format hexadécimal.

La liste est utile pour afficher à distance les fichiers texte ou les fichiers journaux et pour les serveurs sur lesquels les administrateurs sont préoccupés par la dégradation des performances du système.

wmz
la source
1
Jusqu'à présent, cette solution est la plus proche que je demandais.
Shannon Severance
1
Nice, simple, déjà installé. J'ai changé le format en write-host ("{0: X2}" pour forcer 0x0A à apparaître en tant que "0A" et non "A", le 2 pour 2 chiffres en majuscule parce que c'est comme ça que je l'aime
Adam Straughan
1
List.exe était parfait - la list.exe /?commande d'aide ne donne pas beaucoup d'informations, mais une fois dans l'éditeur, appuyez simplement sur ?pour voir les commandes. Houvre l'éditeur Hex et F1
modifie l'
7

Cela fonctionne également sur tout après XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP nécessite le pack Outils d'administration Windows Server 2003 à partir d'ici:

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

des étincelles
la source
la solution la plus portable et la plus compatible sur les fenêtres, pourrait être utilisée même à partir de scripts batch, étonnée de savoir pourquoi cela n’est toujours pas dans le top des réponses
Andry
6

Copiez le fichier dans un nom avec une .COMextension, où le nom de base ne dépasse pas huit caractères. Courir

DEBUG votre_nom de fichier

Cela donnera un ' -' prompt. Type

DEnter

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

D adresse Enter

pour afficher 128 octets à partir de l' adresse , à saisir en hexadécimal, où le début du fichier est l'adresse 100. Tapez

D adresse 1 adresse 2 Enter

afficher de l' adresse 1 à l' adresse 2 . Type

D adresse Lnum Enter

pour afficher num octets (longueur) à partir de l' adressenum est également entré dans l'hex. Utilisez Qpour 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
-
Scott
la source
3
Malheureusement, cela ne fonctionnera pas si la taille du fichier est supérieure à environ 64 Ko, maximum pour un fichier .COM. (Il doit faire partie du segment commençant à 100h).
Ken Le
1
C:\>attrib debug.exe /s. Résultats: File not found - debug.exe. Impossible de trouver le compte officiel, le débogage n'est plus une déclaration prise en charge , mais d'après ce que j'ai vu sur le Web, il semble que le support du débogage a été abandonné depuis un certain temps. J'ai trouvé DebugDiag de Microsoft. (Téléchargement supplémentaire.) Débogage? Peut-être qu'il prend en charge la recherche de fichiers dans HEX? Livré sous forme de fichier .MSI. Nécessite un mot de passe administrateur pour l'installation. Je ne suis pas un.
Shannon Severance
@Ken j'avais déjà utilisé head -c4096 bigFileName > smallFileNamesur Linux pour obtenir les 4 premiers Ko des fichiers. Les lignes sont suffisamment petites pour que quatre Ko en ait suffisamment pour mon but
Shannon Severance
Alors, pourquoi ne pas utiliser hexdump -Csous Linux?
Ken
3
@Shannon debug fait partie de DOS, et par conséquent, si vous utilisez x64, il n'y est pas.
kinokijuf
6

HxD est un éditeur hexadécimal portable, ce qui ne nécessite aucune installation, et n’est rien de plus qu’un fichier exe.

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

Une autre option portable similaire est Frhed:

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

Jay Sullivan
la source
Nice to have- Il existe des éditions installables et portables.
Pdem
5

Étant donné que Windows 7 est livré avec le framework dotnet 3.5 intégré, vous aurez le compilateur C # intégré afin que vous puissiez, par exemple, récupérer la liste dans http://illegalargumentexception.blogspot.co.uk/2008/04/c- file-hex-dump-application.html , puis compilez à l'aide de

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

et vous devriez vous retrouver avec un printhex.exe qui devrait afficher les caractères hexadécimaux et ascii.

sgmoore
la source
Simple, et pas besoin de téléchargement gigantesque.
live-love
2

Ce n’est pas idéal, mais si vous ne voulez vraiment rien télécharger, vous pouvez essayer d’utiliser fc / b (comparaison de fichiers en mode binaire) pour comparer ce fichier avec un autre fichier complètement différent, et il vous montrera l’hex valeurs de chaque octet qui sont différentes. Vous obtiendrez peut-être des valeurs identiques dans les deux fichiers et vous pourrez donc les ignorer de la sortie, mais vous pouvez savoir si cela se produit en recherchant les valeurs manquantes dans la colonne offset.

sgmoore
la source
Ce n’est pas idéal, mais j’ai pu le faire en créant un fichier de 0x00 octets puis en le comparant. Étant un fichier texte que je cherchais, et qui m'intéressait surtout 0a et 0d, un fichier de valeurs nulles a été utilisé pour la comparaison. Mais il ne fournit pas à la fois la vue du personnage et la vue des hexagones côte à côte, il a été difficile de trouver où je voulais regarder plus fort. (Comme le fait le débogage dans la réponse de Scott et le mode hexl d'Emacs. Je n'avais pas demandé de vue côte à côte, mais c'est assez crucial pour la façon dont j'utilise les vidages d'hex.)
Shannon Severance
2

Vous pouvez utiliser la fonction PowerShell ci-dessous avec Get-Content pour afficher un hexdump du contenu du fichier, par exemple Get-Content -Encoding Byte 'MyFile.bin' | Get-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 copie.

function Get-HexDump
{
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [byte[]] $Bytes,
        [Parameter(ValueFromPipeline = $false)]
        [string] $Encoding
    )

    BEGIN
    {
        if ([string]::IsNullOrEmpty($Encoding) -eq $true)
        {
            $Encoding = "ascii"
        }

        if ($Encoding -inotin [System.Text.Encoding]::GetEncodings().Name + "ascii" + "unicode")
        {
            Throw New-Object ArgumentException("Encoding must be $([System.Text.Encoding]::GetEncodings().Name -join ", "), unicode, or ascii.", '$Encoding')
        }

        $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)
            {
                $bufferChars = $displayEncoding.GetChars($buffer);
                $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { "." } else { "$_" } }) -join "")
                $hexRow += "$($hexValue)   $($bufferText)"
                $hexRow
            }
            else
            {
                $hexRow += "$($hexValue) "
            }

            $counter++
        }
    }

    END
    {
        $counter--

        if ($counter % 16 -ne 15)
        {
            $hexRow += " " * (((16 - $counter % 16) * 3) - 1)
            $bufferChars = $displayEncoding.GetChars($buffer);
            $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { "." } else { "$_" } }) -join "")
            $hexRow += "$($bufferText)"
            $hexRow
        }
    }
}

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   ????????????????
JamieSee
la source
Ou utilisez simplement Format-Hex nomfichier
techdude
@techdude Format-Hex n'est pas disponible dans toutes les versions de PowerShell. Il n'existe pas dans PowerShell 4 et versions antérieures. J'ai écrit ce code avant que Format-Hex n'ait jamais existé.
JamieSee
Comment inverser le retour au fichier binaire?
Zimba
0

Je sais que vous utilisez Emacs, mais les utilisateurs de Vim peuvent utiliser un xxdutilitaire:

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

c'est à dire

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
la source