incorporer des caractères dans int et vice versa

J’ai une carte à puce sur laquelle je peux stocker des octets (multiple de 16). Si je le fais: Save(byteArray, length) je peux alors Receive(byteArray,length) et je pense que je vais obtenir un tableau d’octets dans le même ordre que celui que j’ai stocké. Maintenant, j’ai un tel problème. Je me suis rendu compte que si je stockais un entier sur cette carte et qu’une autre machine (avec une finalité différente) le lisait, les données pourraient être fausses. Donc, j’ai pensé que la solution serait peut-être que je stocke toujours les données sur cette carte, d’une manière légèrement endian, et que je récupère toujours les données d’une manière légèrement endian (j’écrirai des applications pour lire et écrire, je suis donc libre d’interpréter les nombres comme.). Est-ce possible? Voici quelque chose que je suis venu avec:

Incorporer un entier dans un tableau de caractères:

 int x; unsigned char buffer[250]; buffer[0] = LSB(x); buffer[1] = LSB(x>>8); buffer[2] = LSB(x>>16); buffer[3] = LSB(x>>24); 

Il est important de penser que la fonction LSB doit renvoyer l’octet le moins significatif, quelles que soient les extrémités de la machine. A quoi ressemblerait cette fonction LSB?

Maintenant, pour reconstruire le nombre entier (quelque chose comme ceci):

 int x = buffer[0] | (buffer[1]<<8) | (buffer[2]<<16) | (buffer[3]<<24); 

Comme je l’ai dit, je veux que cela fonctionne, peu importe l’endianne de la machine qui le lit et l’écrit. Est-ce que ça va marcher?

La fonction ‘LSB’ peut être implémentée via une macro comme suit: –

 #define LSB(x) ((x) & 0xFF) 

Si x n’est pas signé.

Si votre bibliothèque C est compatible avec posix, vous disposez de fonctions standard permettant de faire exactement ce que vous essayez de coder. ntohl , ntohs , htonl , htons (réseau pour héberger long, réseau pour héberger court, …). De cette façon, vous n’avez pas besoin de changer votre code si vous voulez le comstackr pour une architecture big-endian ou little-endian. Les fonctions sont définies dans arpa/inet.h (voir http://linux.die.net/man/3/ntohl ).

Je pense que la réponse à votre question est OUI, vous pouvez écrire des données sur une carte à puce de telle sorte qu’elle soit universellement (et correctement) lue par des lecteurs d’orientation big endian ET little endian. Avec une grosse mise en garde: il incomberait au lecteur de faire l’interprétation, et non à votre carte à puce interprétant le lecteur, n’est-ce pas? Autrement dit, comme vous le savez, il existe de nombreuses routines pour déterminer l’endurance ( 1 , 2 , 3 ). Mais ce sont les lecteurs qui devraient contenir du code pour tester l’endurance, pas votre carte.

Votre exemple de code fonctionne, mais je ne suis pas sûr que ce serait nécessaire étant donné la nature du problème tel qu’il est présenté.

À propos, ICI est un post connexe.