Получение значения LSB из Hex (код C) - PullRequest
0 голосов
/ 09 июня 2010

У меня есть такой код в C:

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

Мне нужно извлечь его так, чтобы окончательное значение было:

0xa1df7

Мне удалось извлечь и заставить его работать, только если шестнадцатеричные значения имеют как минимум 1 ноль:

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

используя код ниже:

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;
}

Кажется, последний еще {...} блок меня беспокоит. Есть идеи? Спасибо!

Ответы [ 4 ]

5 голосов
/ 09 июня 2010
#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;
}

выводит "a1df7"

0 голосов
/ 09 июня 2010
unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07};

Хм, но это выглядит как обычный сетевой порядок байтов.

Для 32-битного int сделайте что-то вроде:

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

И аналогично для 64-битных значений.

PS Будьте осторожны со знаком.В некоторых случаях для принудительного расширения знакового бита требуется явное преобразование в тип со знаком.

0 голосов
/ 09 июня 2010
 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 голосов
/ 09 июня 2010

Вам лучше сначала преобразовать все в шестнадцатеричную строку ("0a1df007"), а затем удалить все нули:)

...