这个问题可能看起来很愚蠢,但请指导我
我有一个将长数据转换为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的倍数。