2017-05-04 1 views
2

Je suis un programmeur Java et j'ai essayé d'utiliser deux façons différentes d'imprimer des octets dans stdout.Cast int dans un tableau de deux octets

unsigned char bytes[2]; 
//... 
printf("%x%x", bytes[0], bytes[1]); 
std::cout << bytes[0] << bytes[1]; 

Mais la sortie de ces méthodes est différent. Pourquoi? Comment rendre la sortie printf la même qu'avec std::cout?

+4

Votre appel printf est l'impression en bas cas hexadécimal (le% x) pendant que l'appel cout imprime la valeur char. –

+0

Qu'y a-t-il dans 'bytes'? –

Répondre

3

Avec std::cout ils seront imprimés en tant que caractères.

Avec printf promotion d'entier se produit et ils sont transmis comme int s, et le spécificateur %x dit printf d'imprimer un unsigned int au format hexadécimal.

Vous pouvez obtenir printf d'imprimer un caractère en utilisant %c, ou vous pouvez obtenir std::cout pour l'imprimer comme hex en faisant la promotion vous et le réglage du hex drapeau:

std::printf("%c%c", bytes[0], bytes[1]); 
std::cout << std::hex << +bytes[0] << +bytes[1]; 
1

%x délivre un numéro dans un hexadécimal CS, par exemple, le code

int x = 80; 
printf("%x", x); 

imprimera 50. Pour écrire des nombres sous forme décimale, vous devez utiliser %d. En outre, pour imprimer char variable dans une forme d'un nombre, pas de caractère, vous devez le jeter aux int:

unsigned char bytes[2]; 
//... 
printf("%d%d", bytes[0], bytes[1]); 
std::cout << (int)bytes[0] << (int)bytes[1]; 
+0

Différent encore –

+0

Sur mon ordinateur, ce code imprime des lignes identiques (en fait, elles sont imprimées sur une ligne, mais de toute façon elles sont identiques). Qu'est-ce qui est imprimé dans votre cas? – alexeykuzmin0

+0

@ St.Antario: Qu'y a-t-il dans le tableau? –

1

L'équivalent serait:

#include <iomanip> // needed for std::hex 

std::cout << std::hex << static_cast<unsigned int>(bytes[0]) << static_cast<unsigned int>(bytes[1]); 

Deux différences:

  • votre printf avec %x imprime en hexadécimal - pour les flux C++, il y a std::hex pour cela
  • votre printf prend int valeurs (pour %x), mais les flux C de ne pas un operator<< qui imprime un unsigned char comme une valeur entière (au lieu il sera imprimé comme un personnage), de sorte que vous devez jeter le unsigned char à une type entier en premier (par ex. unsigned int comme dans le code ci-dessus)