在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
需要完全零初始化以进行“干净”转换。