2009-09-25 11 views
3

Je cherche à écrire une paire d'utilitaires qui lisent dans une liste d'entiers séparés par une nouvelle ligne sur stdin et sortent leur binaire (4 octets) équivalent à stdout, et vice versa. Ma première pensée était une simple commande bash/linux qui ferait cela, mais je ne pouvais pas en trouver un. Ma deuxième pensée était de le faire en C++, mais je n'arrive pas à comprendre comment changer stdin ou stdout en un flux binaire.Binaire stdin et stdout

Avez-vous pensé à un bon moyen de le faire? Je suis impartial à tout langage de programmation particulier.

Répondre

5

En Perl, vous pouvez juste essayer:

perl -ne 'chomp; print pack 'i', $_;' 

Cela vous donnera un natif hôte signé entier d'au moins 32 bits, mais peut-être plus en fonction de votre compilateur C local.

D'autres options à emballer peuvent aller à la place du 'i', comme 'l' qui vous donnera une longue signée, qui devrait être de 32 bits. Et il y a encore plus d'options pour little-endian ou big-endian. Pour la description complète, veuillez consulter le http://perldoc.perl.org/functions/pack.html.

Et voici votre solution en C, au cas où vous voulez le faire de manière ennuyeuse. :)

#include <stdio.h> 

int main() { 
    int x; 

    while (fscanf(stdin, "%i", &x)) { 
     fwrite(&x, sizeof(x), 1, stdout); 
    } 

    return 0; 
} 
+0

Merci, ce bit perl est génial. – Rich

+0

Pas de soucis ... content de pouvoir aider. –

4

Vous n'avez pas besoin de "changer la sortie stdout en binaire", il suffit de sortir le binaire. Cela va certainement confondre, par ex. un émulateur de terminal connecté à ce flux, mais cela est à prévoir.

Une boucle simple de fscanf() pour lire chaque entier, suivi d'un fwrite() pour l'écrire devrait fonctionner. Méfiez-vous des problèmes d'endianness, vous pourriez vouloir sortir chaque octet séparément.

+0

Il est important de mentionner endian-ness (c'est pourquoi Unix préfère le texte), bien que vous soyez redirigé vers un programme, les deux sont sur la même machine. Si vous avez utilisé un socket à la place (pour un programme sur une machine séparée), alors l'endian-ness entre en jeu. –

1

Sur Unix et ses dérivés, il n'y a pas besoin de se préoccuper de savoir si le stdin ou stdout sont en mode « binaire » - les modes binaires et texte sont les mêmes. Je n'ai pas effectué de tests approfondis sur Windows, mais sous Cygwin, je n'ai pas non plus remarqué de problèmes.

+0

Bon, je suppose que mon problème était que je ne comprenais pas comment sortir le nombre "en mode binaire". 'cout << 256; sortira les 3 caractères ascii "256" pas l'équivalent binaire. – Rich

+1

@Rich: oui; Cout prend du texte et convertit les éléments en texte par défaut. L'analogue de 'fwrite()' de C devrait être utilisé à la place. –