2010-03-30 3 views
2

J'ai des fichiers binaires contenant des entiers. Y a-t-il une bonne commande Unix, qui me permettra de le vider dans un terminal sans information de décalage, etc.?Existe-t-il une commande Unix pour le vidage de la représentation textuelle d'un fichier binaire?

Quelque chose comme:

double int[4]; 
while (fread(tmp, sizeof(int), 4, stdin)) 
    for(int i = 0; i < 4; i++) 
     printf("%d\t",tmp[i]); 

Il semble que hexdump et od me donne les informations que je veux, mais la sortie est trop bavard. Je veux juste le contenu.

+0

od dispose de nombreuses options de sortie. quelles options avez-vous utilisé? – ghostdog74

+0

Donc, par "représentation de texte", vous voulez dire "hex"? – jalf

Répondre

7

Pour résoudre ce genre de problème à l'aide des outils Unix standard, vous généralement conduit un groupe ensemble:

od -v -t d4 ~/.profile | awk '{$1 = ""; print}' | fmt -1 | sed 's/^ *//' 

Les od imprime chaque mot de 32 bits en décimal, avec des décalages précédents. Le commentaire awk supprime les décalages. La commande fmt force un entier par ligne. Les bandes de commande sed entraînent des espaces hors du résultat.

-1

strings semble être ce que vous cherchez:

$ strings file 

Il affichera toutes les chaînes contenues dans le fichier binaire. C'est encore un peu bavard pour un gros fichier, mais il est au moins lisible.

+0

ne convertit pas les codages entiers binaires en entiers – tucuxi

+0

Désolé. Pas ce qu'il veut. Lire l'extrait. – zneak

+0

[strings] (https://en.wikipedia.org/wiki/Strings_%28Unix%29) ne produit que des caractères * imprimables * qui se terminent par un caractère NUL. –

2

Est-ce que od -Un nom de fichier ne vous donne pas les données sans le décalage?

+1

Donc, en combinant avec les réponses de Norman et Nikolai: _od -v -An -td4_ devrait donner le résultat recherché – stefaanv

5

Essayez la incantatoire hexdump(1) suivante:

hexdump -v -e '4/4 "%d\t"' file

impression des forces -v du fichier entier (pas * pour répéter les lignes),
-e prend chaîne de format '4/4 "%d\t"' qui indique hexdump(1) itérer quatre fois , en imprimant quatre octets à chaque itération avec le masque printf donné.

+0

+1. C'est la solution la plus simple. Cela devrait être la réponse acceptée. –

1

Vous pouvez répliquer presque exactement vos entrées et sorties désirées avec Perl. Il n'y a littéralement aucun fichier en lecture ou en écriture qui ne peut être fait, plus facilement qu'en C.

La fonction 'sysread' est la plus proche de celle de C.

Vous pouvez spécifier un descripteur de fichier, un tampon automatique, des octets à lire et un décalage dans le fichier. Et en Perl, l'ouverture et la fermeture d'un fichier est automatique dans la plupart des cas.

Vous n'avez pas spécifié assez d'informations pour écrire un exemple, mais ce lien devrait vous aider à démarrer:

Cookbook Ch 8

Ou tout simplement « perl sysread » google

Qu'est-ce que vous voulez peut probablement être fait dans un programme Perl 1 ligne.

Questions connexes