2016-11-15 2 views
0

Je suis nouveau pour les endans. J'essaye de convertir un grand tableau d'entiers endian en chaîne hexadécimale en petit boutiste. J'ai essayé de convertir le grand tableau d'entiers endian en petite chaîne hexa décimale d'Endian. Mais à la fin, obtenir de gros caractères hexadécimaux codés en hexadécimal plutôt que du petit boutiste. S'il vous plaît aidez-moiconvertir tableau entier signé en gros endian en hexa décimal 16 bits en petit boutiste en c

gint16 frame[5] = {10, -26, 35, 7, -35}; //big endian 
gint16 frame_i[5]; 
size_t i; 
for (i= 0; i < 5; i++) { 
    frame_i[i] = (frame[i] << 8) | ((frame[i] >> 8) & 0xFF); //big endian to little endian 
} 
char *str = malloc(5 * 4 + 1); 
size_t j; 
for (j= 0; j < 5; j++) { 
    snprintf(str + j * 4, 5, "%04X", frame_i[j] & 0xFFFF); // getting big endian instead of little endian 
} 
+0

Je ne peux pas imaginer pourquoi vous avez besoin d'une chaîne little-endian. Les représentations textuelles des nombres sont toujours m.s. chiffre en premier. L'endianness n'a rien à voir avec la façon dont les tableaux sont organisés: le problème est la séquence d'octets en mémoire qu'une valeur multi-octets est naturellement stockée par le processeur. S'il vous plaît [lire à propos de l'endianness] (https://en.wikipedia.org/wiki/Endianness). –

+0

En outre cette ligne '(frame_i [i] << 8) | ((frame_i [i] >> 8) & 0xFF); 'n'a aucun effet - la valeur de l'expression n'est pas affectée. –

+0

Veuillez poster l'exemple [Minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) qui évitera les erreurs idiotes dans la question, laissant planer le doute qu'il pourrait y avoir plus d'erreurs de transcription. –

Répondre

1

L'expression (frame_i[i] << 8) | ((frame_i[i] >> 8) & 0xFF); n'a pas d'effet (vous auriez remarqué que, si vous aviez utilisé -Wall option du compilateur). En outre, vous devez appliquer cette opération sur la variable frame et stocker le résultat dans frame_i, par exemple:

int16_t frame[5] = {10, -26, 35, 7, -35}; 
int16_t frame_i[5] = {0}; 
size_t i; 

for (i = 0; i < sizeof(frame)/sizeof(int16_t); i++) { 
    frame_i[i] = (frame[i] << 8) | ((frame[i] >> 8) & 0xFF); 
} 

for (i = 0; i < sizeof(frame)/sizeof(int16_t); i++) { 
    printf("%04X -> %04X\n", frame[i] & 0xFFFF, frame_i[i] & 0xFFFF); 
} 

Sortie

000A -> 0A00 
FFE6 -> E6FF 
0023 -> 2300 
0007 -> 0700 
FFDD -> DDFF 

Notez que @WeatherVane a souligné, la Le décalage vers la droite d'un entier signé négatif a un comportement défini par l'implémentation. Voir les réponses à la question this. Envisagez d'utiliser un type non signé, par ex. uint16_t à partir de stdint.h.

+0

Veuillez utiliser les types 'unsigned' pour ce changement de vitesse? –

+0

@WeatherVane, voulez-vous dire que le bon décalage est défini par l'implémentation pour signé? –

+0

Oui, je l'ai dit. –