这个问题可能看起来很傻,但请指导我我有一个函数将长数据转换为字符数组
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或类似的功能。
9条答案
按热度按时间iaqfqrcu1#
将endianness与其他函数匹配的负担留给您,这里有一种方法:
为了安全起见,下面是相应的另一个方向:
从
char[4]
到long再返回是完全可逆的;从long到char[4]
再返回,对于最大值2^32-1是可逆的。请注意,所有这些都只对无符号类型定义良好。
(My例如,如果从左到右读取
pdest
,则为 little endian。)CHAR_BIT == 8
。一般来说,在代码中将8的倍数替换为CHAR_BIT
的倍数。8qgya5xd2#
一个简单的方法是使用memcpy:
但是,这并没有考虑到字节序,所以如果您必须在多台计算机之间共享数据,请小心。
owfi6suc3#
您可以执行以下操作:
并访问
c[0] c[1] c[2] c[3]
。这很好,因为它不浪费内存,而且非常快,因为除了初始值之外没有任何移位或任何赋值,而且它可以双向工作。ev7lccsx4#
如果你想把
sizeof (long)
字节的内存作为一个单一的长,那么你应该做下面的事情:这件事可以通过粘贴每个字节的长使用位移动和粘贴,如下所示。
如果你想将“1234\0”字符串转换为1234L,那么你应该
92vpleto5#
这是否有效:
2uluyalo6#
ercv8c1e7#
这是肮脏的,但它的工作:
uqjltbpv8#
小心以null结尾的字符串,因为您最终会将null结束符以外的任何字节复制到
combined
中;因此,在上面的分配中,charArray
需要被完全零初始化以用于“干净”转换。a6b3iqyw9#
刚刚发现这个尝试了以上的一个以上都无济于事:=(:
对我来说效果很好。为了给予应有的赞扬,我在这里找到了它:https://www.convertdatatypes.com/Convert-char-Array-to-long-in-C.html