2017-07-10 10 views
0

Je sais comment faire un transfert de bits, mais mes valeurs semblent s'écarter du bord et je perds la valeur d'origine en essayant de conserver 8 bits.Comment coder des entiers non signés 16 et non signés de 32 bits dans une matrice de mémoire 8 bits non signée?

+0

Cela pourrait très bien être une question intéressante mais vous allez devoir fournir plus d'informations - par exemple, le code de l'échantillon, l'entrée de l'échantillon et la sortie de l'échantillon qui montre le problème. [mcve] – davidbak

Répondre

1

Pour Entier non signé 16 bits:

unsigned short val16 = 0x1234; 
unsigned char enc[2]; 
enc[0] = val16 & 0xff;    // stores 0x34 to enc[0] 
enc[1] = val16 >> 8 & 0xff;   // stores 0x12 to enc[1] 

Pour Entier non signé 32 bits:

unsigned int val32 = 0x12345678; 
unsigned char enc[4]; 
enc[0] = val32 & 0xff;    // stores 0x78 to enc[0] 
enc[1] = val32 >> 8 & 0xff;   // stores 0x56 to enc[1] 
enc[2] = val32 >> 16 & 0xff;  // stores 0x34 to enc[2] 
enc[3] = val32 >> 24 & 0xff;  // stores 0x12 to enc[3] 

Mise à jour

exactement les mêmes codes avec littéraux décimaux sont:

unsigned short val16 = 4660;  // 4660 = 0x1234 
unsigned char enc[2]; 
enc[0] = val16 & 255; 
enc[1] = val16 >> 8 & 255; 

et

unsigned int val32 = 305419896; // 305419896 = 0x12345678 
unsigned char enc[4]; 
enc[0] = val32 & 255; 
enc[1] = val32 >> 8 & 255; 
enc[2] = val32 >> 16 & 255; 
enc[3] = val32 >> 24 & 255; 
+0

merci! est-il possible de le faire sans utiliser le type de données hexadécimal? – bigdog225

+0

@ bigdog225 Oui, bien sûr. J'ai utilisé des littéraux hexadécimaux dans la réponse juste pour clarifier les limites de chaque octet dans une valeur de 2 octets ou de 4 octets. Vous pouvez utiliser d'autres types littéraux, tels que des nombres décimaux. – nglee

+0

comment ferais-je cela avec des décimales? si cela ne vous dérange pas de me montrer – bigdog225