Je suis en train de réécrire le code de Big Endian Machine à Little Endian. Disons qu'il existe une variable appelée a
, qui est un entier de 32 bits qui contient l'horodatage actuel (horodatage actuel de la requête de l'utilisateur).Confusion dans l'interprétation de l'entier 32 bits dans les machines Big Endian et Little Endian
dans la machine Big Endian, maintenant le code est ainsi:
uint32 a = current_timestamp_of_user_request;
uint8 arr[3] = {0};
arr[0] = ((a >> (8 * 2)) & 0x000000FF);
arr[1] = ((a >> (8 * 1)) & 0x000000FF);
arr[2] = ((a >> (8 * 0)) & 0x000000FF);
Maintenant, quand je suis en train d'écrire la même logique pour petite machine endian, puis-je utiliser le même code (méthode a), ou devrais-je convertir le code de cette façon (appelons cette méthode b)?
uint32 a = current_timestamp_of_user_request;
uint32 b = htonl(a);
uint8 arr[3] = {0};
arr[0] = ((b >> (8 * 2)) & 0x000000FF);
arr[1] = ((b >> (8 * 1)) & 0x000000FF);
arr[2] = ((b >> (8 * 0)) & 0x000000FF);
j'ai écrit ce programme pour vérifier:
#include<stdio.h>
#include<stdlib.h>
void main() {
long int a = 3265973637;
long int b = 0;
int arr[3] = {0,0,0};
arr[0] = ((a >> (8 * 2)) & 0x000000FF);
arr[1] = ((a >> (8 * 1)) & 0x000000FF);
arr[2] = ((a >> (8 * 0)) & 0x000000FF);
printf("arr[0] = %d\t arr[1] = %d\t arr[2] = %d\n", arr[0], arr[1], arr[2]);
b = htonl(a);
arr[0] = ((b >> (8 * 2)) & 0x000000FF);
arr[1] = ((b >> (8 * 1)) & 0x000000FF);
arr[2] = ((b >> (8 * 0)) & 0x000000FF);
printf("After htonl:\n");
printf("arr[0] = %d\t arr[1] = %d\t arr[2] = %d\n", arr[0], arr[1], arr[2]);
}
Résultats:
Result with little endian machine:
bgl-srtg-lnx11: /scratch/nnandiga/test>./x86
arr[0] = 170 arr[1] = 205 arr[2] = 133
After htonl:
arr[0] = 205 arr[1] = 170 arr[2] = 194
Result with big endian machine:
arr[0] = 170 arr[1] = 205 arr[2] = 133
After htonl:
arr[0] = 170 arr[1] = 205 arr[2] = 133
On dirait sans conversion en grand ordre endian, la même logique (sans htonl()
) donne des résultats exacts dans remplir le tableau arr
. Maintenant, pouvez-vous s'il vous plaît répondre dois-je utiliser htonl()
ou non si je veux que le tableau soit le même dans les deux petites machines endian et big endian (petit résultat endian devrait être exact comme résultat big endian).
Si le but est de mettre l'octet le moins significatif de l'horodatage dans 'arr [2]', alors le code devrait être identique sur les deux machines. Les opérations de décalage et de masquage dans le code ne dépendent pas de l'endian. – user3386109