C++ 从十六进制获取LSB值(C代码)

C++ 从十六进制获取LSB值(C代码),c++,c,bit-manipulation,bit-shift,C++,C,Bit Manipulation,Bit Shift,我在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 ( (dat

我在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;
}
for(int i=0;i如果((数据[i]4)您最好先将其全部转换为十六进制字符串(“0a1df007”),然后删除所有零:)

您最好先将其全部转换为十六进制字符串(“0a1df007”),然后删除所有零:)


#包括
无符号字符常量数据[]={0x0a,0x1d,0xf0,0x07};
int main(int argc,char*argv[]){
int i,r=0;
对于(i=0;i
#包括
#包括
无符号字符常量数据[]={0x0a,0x1d,0xf0,0x07};
int main(int argc,char*argv[]){
int i,r=0;
对于(i=0;i
无符号字符常量数据[]={0x0a,0x1d,0xf0,0x07};
无符号整数值=0;
对于(int i=0;i>4;
如果(半字节>0)
{
值
无符号字符常量数据[]={0x0a,0x1d,0xf0,0x07};
无符号整数值=0;
对于(int i=0;i>4;
如果(半字节>0)
{
价值
嗯,但这看起来像是一个普通的网络字节顺序

对于32位int,请执行以下操作:

unsigned char *p = (unsigned char *)data;
int val = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
unsigned char*p=(unsigned char*)数据;
int val=(p[0]
嗯,但这看起来像是一个普通的网络字节顺序

对于32位int,请执行以下操作:

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

int val=(p[0]该数组的最终值没有意义。它们是什么类型的输入值,为什么它们会导致最终值?感谢Christoff。0xa1df7是数组中的值,因此数组的每个元素中的每个“0”都被删除。对于{0x0a,0xd0,0xf0,0x07}的情况,输出将是-0xadf7。什么是
N[]
为什么不在出现问题的
else
子句中使用它呢?Greg-hi.int N[]={12,8,4,0};do(last else block)-else{tmp=(tmp该数组的最终值没有意义。它们是什么类型的输入值,为什么它们会导致最终值?感谢Christoff。0xa1df7是数组中的值,因此数组的每个元素中的每个“0”都被删除。对于{0x0a,0xd0,0xf0,0x07}的情况,输出将是-0xadf7。什么是
N[]
为什么不在出现问题的
else
子句中使用它呢?Greg-hi.int N[]={12,8,4,0};do(last else block)-else{tmp=(tmp不是最简单的…因为您必须将hexstring转换回整数。这似乎是一种过于复杂的操作方式。这不是最简单的…因为您必须将hexstring转换回整数。如果30行以上的代码可以减少到几行,这似乎是一种过于复杂的操作方式。^)如果30行以上的代码可以减少到只有几行,那就太好了;^)这是不对的。所需的输出是“a1df7”。不过,谢谢。请向我解释0x000a1df7与0xa1df7有何不同?或者您需要字符串?-
printf(“%x\n”,val)
-默认情况下作为%x条带前导零。这是不对的。所需的输出是“a1df7”。但是,谢谢。请向我解释0x000a1df7与0xa1df7有何不同?或者您需要字符串?-
printf(“%x\n”,val)
-默认情况下作为%x条带前导零。
unsigned char const data[ ] = {0x0a, 0x1d, 0xf0, 0x07};
unsigned char *p = (unsigned char *)data;
int val = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];