在C中将Char数组转换为Long

时间:2011-07-14 01:20:15

标签: c memory

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

8 个答案:

答案 0 :(得分:9)

你可以这样做:

union {
 unsigned char c[4];
 long l;
} conv;

conv.l = 0xABC;

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:7)

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

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]到长而后退是完全可逆的;从长到char[4]然后返回是可逆的,最大值为2 ^ 32-1。

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

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

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

答案 3 :(得分:3)

如果您的意思是将sizeof (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 */

答案 4 :(得分:0)

这是否有效:

#include<stdio.h>

long ConvertCharToLong(char *pSrc) {
    int i=1;
    long result = (int)pSrc[0] - '0';
    while(i<strlen(pSrc)){
         result = result * 10 + ((int)pSrc[i] - '0');
         ++i;
    }
    return result;
}


int main() {
    char* str = "34878";
    printf("The answer is %d",ConvertCharToLong(str));
    return 0;
}

答案 5 :(得分:0)

只是发现这已经尝试了以上一种方法,但无济于事:=(:

    char * vIn = "0";
    long vOut = strtol(vIn,NULL,10);

非常适合我。 要归功于到期日,这是我找到的地方: https://www.convertdatatypes.com/Convert-char-Array-to-long-in-C.html

答案 6 :(得分:-1)

这很脏但是有效:

unsigned char myCharArray[8];
// Put some data in myCharArray here...
long long integer = *((long long*) myCharArray);

答案 7 :(得分:-1)

char charArray[8]; //ideally, zero initialise
unsigned long long int combined = *(unsigned long long int *) &charArray[0];

警惕空终止的字符串,因为您最终会将超出空终止符的任何字节复制到combined;因此,在上述任务中,charArray需要完全零初始化,以便&#34;清洁&#34;转换。