从Hex获取LSB的值(C代码)

0 c c++ bit-manipulation bit-shift

我在C中有这样的代码:

unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07};
Run Code Online (Sandbox Code Playgroud)

我需要提取它,使得最终值为:

0xa1df7
Run Code Online (Sandbox Code Playgroud)

如果十六进制值至少为零,我只能提取并使其工作:

unsigned char const data[ ] = {0x0a, 0xd0, 0xf0, 0x07};
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

似乎最后一个{...}块对我来说很麻烦.有任何想法吗?谢谢!

zed*_*xff 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;
}
Run Code Online (Sandbox Code Playgroud)

输出"a1df7"