2010-06-09 3 views
0

J'ai un code comme celui-ci dans C:valeur Obtenir des LSB de Hex (code C)

unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07}; 

J'ai besoin pour l'extraire de telle sorte que la valeur finale est:

0xa1df7 

Je n'ai été en mesure d'extraire et de le faire fonctionner si les valeurs hexagonales qui ont au moins 1 zéro:

unsigned char const data[ ] = {0x0a, 0xd0, 0xf0, 0x07}; 

utilisant le code ci-dessous:

for(int i = 0; i < SIZE; ++i) 
{ 
    tmp = data[i]; 
    if ((data[i] <= 0x0F) && (((data[i] & 0x0F) == 0) || (data[i] & 0xF0) == 0)) // one of the hex is zero 
    { 
     tmp = ((tmp << 4) >> 4) << N[i]; 
     std::cout << "foo: " << std::hex << tmp << ":" << std::endl;  

    } 
    else if ((data[i] >= 0x0F) && (((data[i] & 0x0F) == 0) || (data[i] & 0xF0) == 0)) 
    { 
     tmp = (tmp >> 4) << N[i]; 
     std::cout << "bar: " << std::hex << tmp << ":" << std::endl; 

    } 
    else 
    { 
     std::cout << "result: " << std::hex << result << ":" << std::endl; 
     std::cout << "tmp << 8: " << std::hex << (tmp << 8)<< ":" << std::endl; 
     result = result | (tmp << 8); 
     std::cout << "result |= (tmp << 8): " << std::hex << result << ":" << std::endl; 
    } 

    result |= tmp; 
    std::cout << "boo: " << std::hex << result << ":" << std::endl; 
} 

Il semble que le dernier bloc {...} soit gênant pour moi. Des idées? Merci!

+3

La valeur finale de ce tableau n'a pas de sens. Quel type de valeurs d'entrée sont-elles et pourquoi devraient-elles conduire à cette valeur finale? –

+0

Merci Christoffer. 0xa1df7 est une valeur du tableau tel que chaque '0' est supprimé dans chaque élément du tableau. Pour le cas de {0x0a, 0xd0, 0xf0, 0x07}, la sortie est - 0xadf7. – Rjff

+0

Qu'est-ce que 'N []' et pourquoi ne l'utilisez-vous pas dans la clause 'else' où vous rencontrez des problèmes? –

Répondre

5
#include <stdio.h> 
#include <stdlib.h> 

unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07}; 

int main(int argc, char*argv[]){ 
    int i,r = 0; 
    for(i=0; i<sizeof(data); i++){ 
     if(data[i] & 0xf0) r = (r<<4) + (data[i]>>4); 
     if(data[i] & 0x0f) r = (r<<4) + (data[i]&0x0f); 
    } 
    printf("%x\n",r); 
    return 0; 
} 

sorties "a1df7"

+0

Merci zed_0xff! :) – Rjff

+0

toujours génial si 30 lignes + de code peuvent être réduites à quelques-unes; ^) – Toad

0

Vous feriez mieux de convertir tout en une chaîne hexagonale premier ("0a1df007"), puis supprimez tous les zéros :)

+0

+ 1 le moyen le plus simple – INS

+2

pas le plus facile ... puisque vous devrez convertir le hexstring en nombre entier. Cela ressemble à une manière trop compliquée de faire les choses – Toad

0
unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07}; 

unsigned int value=0; 
for(int i=0; i<4; i++) 
{ 
    int nibble = (data[i] & 0xf0) >> 4; 
    if(nibble > 0) 
    { 
      value<<=4; 
      value += nibble; 
    } 
    nibble = data[i] & 0x0f; 
    if(nibble > 0) 
    { 
      value<<=4; 
      value += nibble; 
    } 
} 
0
unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07}; 

Uhm , mais cela ressemble à un ordre d'octets réseau simple.

Pour 32bit int, faire quelque chose comme:

unsigned char *p = (unsigned char *)data; 
int val = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; 

Et de même pour les valeurs de 64 bits.

P.S. Faites attention au signe. Dans certains cas, une conversion explicite en un type signé est requise pour forcer l'extension du bit de signe.

+0

Ce n'est pas correct. La sortie requise est 'a1df7'. Merci cependant. – Rjff

+0

expliquez-moi comment 0x000a1df7 est différent de 0xa1df7? ou vous avez besoin de cordes? - 'printf ("% x \ n ", val)' - comme% x supprime les zéros par défaut. – Dummy00001