在C中将Char数组转换为Long

这个问题可能看起来很傻,但请指导我,我有一个函数将长数据转换为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); 

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

将端点与您的其他function相匹配的负担留给您,这是一种方式:

 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到char[4]并且返回是可逆的,最大值为2 ^ 32-1。

请注意,所有这些只是为无符号类型定义良好。

(如果你从左到右阅读pdest ,我的例子就是端。)

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

你可以做:

 union { unsigned char c[4]; long l; } conv; conv.l = 0xABC; 

并访问c[0] c[1] c[2] c[3] 。 这很好,因为它不浪费任何内存并且非常快,因为除了最初的一个之外没有任何移位或任何分配,它可以双向工作。

一个简单的方法是使用memcpy:

 char * buffer = ...; long l; memcpy(&l, buff, sizeof(long)); 

但是,这并不考虑字节序,因此请注意,如果必须在多台计算机之间共享数据。

如果你的意思是将sizeof (long)字节内存视为一个long,那么你应该执行以下操作:

 char char_arr[sizeof(long)]; long l; memcpy (&l, char_arr, sizeof (long)); 

这个事情可以通过使用位移和粘贴来粘贴long的每个字节来完成,如下所示。

 l = 0; l |= (char_arr[0]); l |= (char_arr[1] << 8); l |= (char_arr[2] << 16); l |= (char_arr[3] << 24); 

如果你的意思是将“1234 \ 0”字符串转换为1234L那么你应该

 l = strtol (char_arr, NULL, 10); /* to interpret the base as decimal */ 

这有用吗:

 #include long ConvertCharToLong(char *pSrc) { int i=1; long result = (int)pSrc[0] - '0'; while(i 

这很脏,但它有效:

 unsigned char myCharArray[8]; // Put some data in myCharArray here... long long integer = *((long long*) myCharArray); 
 char charArray[8]; //ideally, zero initialise unsigned long long int combined = *(unsigned long long int *) &charArray[0]; 

警惕空终止的字符串,因为你最终会将空终止符之外的任何字节复制到combined ; 因此,在上面的赋值中, charArray需要完全零初始化以进行“干净”转换。