这个问题可能看起来很愚蠢,但请指导我
我有一个将长数据转换为char数组的功能

void ConvertLongToChar(char *pSrc, char *pDest)
{
    pDest[0] = pSrc[0];
    pDest[1] = pSrc[1];
    pDest[2] = pSrc[2];
    pDest[3] = pSrc[3];
}

我这样调用上面的函数
long lTemp = (long) (fRxPower * 1000);
ConvertLongToChar ((char *)&lTemp, pBuffer);

哪个工作正常。
我需要类似的功能来逆转该过程。将char数组转换为long。
我不能使用atol或类似功能。

最佳答案

剩下的麻烦是将字节序与其他函数进行匹配,这是一种方法:

unsigned long int l = pdest[0] | (pdest[1] << 8) | (pdest[2] << 16) | (pdest[3] << 24);

为了安全起见,这是相应的其他方向:
unsigned char pdest[4];
unsigned long int l;
pdest[0] = l         & 0xFF;
pdest[1] = (l >>  8) & 0xFF;
pdest[2] = (l >> 16) & 0xFF;
pdest[3] = (l >> 24) & 0xFF;

char[4]到long和back是完全可逆的;对于长至2 ^ 32-1的值,从长到char[4]并返回是可逆的。

请注意,所有这些仅针对无符号类型进行了明确定义。

(如果从左到右阅读pdest,则我的示例是little endian。)

附录:我也假设使用CHAR_BIT == 8。通常,用代码中CHAR_BIT的倍数替换8的倍数。

10-08 01:16