D'après ce que j'ai compris, un compilateur crée un fichier binaire composé de 1 et de 0 qu'un processeur peut lire. J'ai un fichier binaire mais comment puis-je l'ouvrir pour voir les 1 et les 0 qu'il y a? Un éditeur de texte dit qu'il ne peut pas l'ouvrir ...
Post-scriptum J'ai un assemblage binaire compilé qui devrait être code binaire simple de 1 et 0?
Réponses:
Selon cette réponse de tyranide :
Mise à jour
Selon cette réponse d' Emilio Bool :
la source
Plusieurs personnes ont répondu à certains aspects de la requête, mais pas à toutes.
Tous les fichiers sur les ordinateurs sont stockés en tant que 1 et 0. Images, fichiers texte, musique, applications exécutables, fichiers objets, etc.
Ils sont tous des 0 et des 1. La seule différence est qu'ils sont interprétés différemment selon ce qui les ouvre.
Lorsque vous affichez un fichier texte en utilisant
cat
, l'exécutable (cat
dans ce cas) lit tous les 1 et les 0 et vous les présente en les convertissant en caractères de votre alphabet ou de votre langue.Lorsque vous affichez un fichier à l'aide d'une visionneuse d'images, il prend tous les 1 et les 0 et les transforme en image, en fonction du format du fichier et de la logique à utiliser pour résoudre le problème.
Les fichiers binaires compilés ne sont pas différents, ils sont stockés en tant que 1 et 0.
La réponse de arzyfex vous donne les outils pour afficher ces fichiers de différentes manières, mais lire un fichier en tant que fichier binaire fonctionne pour n'importe quel fichier sur un ordinateur, tout comme le visualiser sous forme octale, hexadécimale ou même ASCII, il se peut que cela n'ait aucun sens de ces formats.
Si vous voulez comprendre ce que fait un fichier binaire exécutable, vous devez le voir de manière à vous montrer le langage d'assembleur (au début), ce que vous pouvez faire avec,
objdump -d /path/to/binary
qui est un désassembleur, il prend le contenu binaire et le reconvertit en assembleur (qui est un langage de programmation de très bas niveau).
objdump
n’est pas toujours installé par défaut, il peut donc être nécessaire de l’installer en fonction de votre environnement Linux.Quelques lectures externes.
NB: comme le fait remarquer @Wildcard, il est important de noter que les fichiers ne contiennent pas les caractères 1 et 0 (comme vous les voyez à l'écran), ils contiennent des données numériques réelles, des bits d'information individuels qui sont soit sur (1) ou off (0). Même cette description n'est qu'une approximation de la vérité. Le point clé est que si vous trouvez un visualiseur qui vous montre les 1 et les 0, même s'il interprète toujours les données du fichier et vous montre ensuite les caractères ASCII pour 0 et 1. Les données sont stockées dans un format binaire ( voir le lien Numéro binaire ci-dessus). Le wiki de la communauté de Pierre-Olivier couvre cette question plus en détail.
la source
cat
, l’exécutable (cat
dans ce cas) lit tous les 1 et les 0 et vous les présente en les convertissant en caractères de votre alphabet approprié. la langue."cat
ne fait pas ça; toutcat
ce que vous faites est d'écrire des octets sur la sortie standard (à moins que vous n'utilisiez les options "nuisibles" ). Le programme du terminal (et / ou le matériel du terminal, le cas échéant, c'est-à-dire son microprogramme) détermine comment restituer les octets sous forme de caractères, éventuellement avec l'assistance du pilote TTY.Au niveau bas, un fichier est codé sous forme d'une séquence de 0 et de 1.
Mais même les programmeurs y vont rarement en pratique.
Premièrement (et plus important que cette histoire de 0 et de 1), vous devez comprendre que tout ce que l'ordinateur manipule est codé avec des nombres .
Un caractère est codé avec un nombre, à l'aide de tables de jeux de caractères. Par exemple, la lettre "A" a une valeur de 65 lorsqu'elle est codée en ASCII. Voir http://www.asciitable.com
Un pixel est codé avec un ou plusieurs chiffres (il existe de nombreux formats graphiques). Par exemple, dans le format standard à 3 couleurs, un pixel jaune est codé comme suit: 255 pour le rouge, 255 pour le vert, 0 pour le bleu. Voir http://www.quackit.com/css/css_color_codes.cfm (choisissez une couleur et voyez les cellules R, G et B)
Un fichier exécutable binaire est écrit dans Assembly; chaque instruction d'assemblage est codée sous forme de chiffres. Par exemple, l'instruction d'assemblage
MOVB $0x61,%al
est codée par deux nombres: 176,97 Voir http://www.sparksandflames.com/files/x86InstructionChart.html (Chaque instruction a un numéro associé de 00 à FF, car la notation hexadécimale est utilisée, voir ci-dessous)Deuxièmement, chaque numéro peut avoir plusieurs représentations ou notations .
Dis que j'ai 23 pommes.
Mais je peux aussi faire des groupes de 16 pommes. Je vais donc avoir un groupe de 16 et 7 pommes isolées. En notation hexadécimale (c'est ainsi qu'on appelle la base 16), j'écrirai: 17 (16 + 7). Pour distinguer la notation décimale, la notation hexadécimale est généralement notée avec un préfixe ou un suffixe: 17h, # 17 ou $ 17. Mais comment représenter plus de 9 groupes de 16, ou plus de 9 pommes seules? Nous utilisons simplement les lettres de A (10) à F (15). Le nombre 31 (comme dans 31 pommes) est écrit comme # 1F en hexadécimal.
Sur la même ligne, nous pouvons faire un groupe de deux pommes. (Et groupe de deux pommes de groupe de deux, c'est-à-dire groupe de 2x2 pommes, etc.). Alors 23 est: 1 groupe de 2x2x2x2 pommes, 0 groupe de 2x2x2 pommes, 1 groupe de 2x2 pommes, 1 groupe de 2 pommes et 1 pomme solitaire qui sera noté 10111 en binaire.
(Voir https://en.wikipedia.org/wiki/Radix )
Physiquement, les mécanismes permettant deux états (commutateurs) sont faciles à faire, aussi bien sur disque que dans la mémoire.
C'est pourquoi les données et les programmes, vus sous forme de nombres, sont écrits et manipulés sous leur forme binaire.
Puis traduits - en fonction du type de données - dans leur forme appropriée (lettre A, pixel jaune) ou exécutés (instruction MOV).
hexdump
liste les nombres codant les données (ou le programme d'assemblage) dans sa forme hexadécimale. Vous pouvez ensuite utiliser une calculatrice pour obtenir la forme binaire correspondante.la source
Je commencerais par
od
(octal dump) et, en fonction du système, des outils tels queobjdump
utiles.la source
Vous pouvez l'ouvrir dans un éditeur hexadécimal qui le présente sous la forme d'une série de valeurs hexadécimales.
xxd file
Qu'est-ce que vous essayez d'accomplir?
la source
bvi
est un éditeur binaire virtuel avec des liaisons de clé vim. Il est disponible sur la plupart des systèmes Linux.la source
La commande Linux strings imprime les chaînes de caractères imprimables dans des fichiers, par exemple:
etc ... c'est plutôt plus lisible que binaire.
la source
strings
commande supprimera la plupart des octets qu'il veut voir.strings
commande - en particulier avec une longueur plus longuestrings -n 6
- aide vraiment à déterminer le contenu d'un fichier binaire s'il contient des constantes de chaîne, etc. Cette réponse aurait dû être un commentaire. ont été bien.strings
utilité de la commande, mais le fait qu'elle ne réponde pas à la question sur l'OP ici.Une partie importante à propos de laquelle vous semblez encore confus: les valeurs hexadécimales ne sont qu'une représentation différente des valeurs binaires. La plupart des éditeurs hexadécimaux ou des vidages hexadécimaux affichent les valeurs dans la base hexadécimale, car elles sont plus lisibles que dans la base binaire.
Par exemple:
Binaire:
Ce qui est 35 et 32 en décimal
Aussi 35 et 32 en décimal
la source
vim
installé pour utiliserxxd
.Vous pouvez visualiser le fichier en binaire dans
vim
, par:vim
:% !xxd -b
La
xxd
commande peut être modifiée davantage, par exemple:-g4
, qui regroupera les bits dans des packs 32 bits-c4
, ce qui formatera la sortie, avoir 4 octets par ligneL'ajout des deux indicateurs ci-dessus vous donnera un entier de 32 bits par ligne.
la source
Vous pouvez le faire avec, par exemple, ce ruby one-liner:
Les systèmes traditionnels basés sur le C supportent mal la sortie de données en binaire, autant que je sache. Ce n'est généralement pas très utile car il est assez difficile à lire, contrairement aux dumps hexadécimaux.
la source
%08b
provoque le regroupement de la sortie en octets.GHex est votre ami :)
Vous pouvez l'installer en ligne de commande
Ubuntu:
Fedora:
la source