首页 > 解决方案 > 如何将 4 字节 `char` 数组转换为 `unsigned long` 类型的一个变量?

问题描述

union sUnion {
    unsigned long hex;
    float var;
};

void Testcode(void)
{
    char rdata[4] = { 0xd7, 0xa3, 0x40, 0xc1 };         // to DEC: -12.04
    char ctemp[100];

    union sUnion r;
    r.hex = 0xc140a3d7;       //<=== ??????

    sprintf(ctemp, "hex = %x, float = %f", r.hex, r.var);
}

我想将数据rdata放入r.hex变量中以产生结果-12.04

标签: c

解决方案


如果断言失败,则更改整数的类型

_Static_assert (sizeof(unsigned long) == 4, "assert1");
#define INTLENGTH sizeof(unsigned long)

//endianess independent
unsigned long covert1(void *varr, int endianness)
{
    unsigned char *arr = varr;
    unsigned long result;

    #define MAXINDEX (INTLENGTH -1)

    if(endianess)
        result = (unsigned long)arr[0] + ((unsigned long)arr[1] << 8) + ((unsigned long)arr[2] << 16) + ((unsigned long)arr[3] << 24);
    else
        result = (unsigned long)arr[MAXINDEX - 0] + ((unsigned long)arr[MAXINDEX - 1] << 8) + ((unsigned long)arr[MAXINDEX - 2] << 16) + ((unsigned long)arr[MAXINDEX - 3] << 24);
    return result;
}

//arr has to have seme endianness as integers
unsigned long covert(void *arr)
{
    unsigned long result;
    memcpy(&result, arr, sizeof(result));
    return result;
}

推荐阅读