C语言中字符数组到长字符的转换

C语言中字符数组到长字符的转换,c,memory,C,Memory,这个问题可能看起来很傻,但请引导我 我有一个将长数据转换为字符数组的函数 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); ConvertLongToC

这个问题可能看起来很傻,但请引导我 我有一个将长数据转换为字符数组的函数

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);
这很好用。 我需要一个类似的函数来反转这个过程。将字符数组转换为长字符数组。
我不能使用atol或类似的函数。

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

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

但是,这并没有考虑到endianness,因此,如果您必须在多台计算机之间共享数据,请小心。

将endianness与其他函数匹配的负担留给您,这里有一种方法:

unsigned long int l = pdest[0] | (pdest[1] << 8) | (pdest[2] << 16) | (pdest[3] << 24);
char[4]
到long和back是完全可逆的;从long到
char[4]
再到back对于最大为2^32-1的值是可逆的

请注意,所有这些都是为无符号类型定义的

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


附录:我还假设
CHAR\u BIT==8
。通常,用代码中字符位的倍数替换8的倍数。

如果要将
sizeof(long)
字节内存视为单个long,则应执行以下操作:

char char_arr[sizeof(long)];
long l;

memcpy (&l, char_arr, sizeof (long));
这件事可以通过使用位移位和粘贴来粘贴每个长字节,如下所示

l = 0;
l |= (char_arr[0]);
l |= (char_arr[1] << 8);
l |= (char_arr[2] << 16);
l |= (char_arr[3] << 24);
这是否有效:

#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;
}
#包括
长转换字符(char*pSrc){
int i=1;
长结果=(int)pSrc[0]-“0”;
而(i你可以做:

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

conv.l = 0xABC;

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

这是脏的,但它可以:

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

小心以null结尾的字符串,因为您最终会将null终止符之外的任何字节复制到组合的
中;因此在上述赋值中,
字符
需要完全零初始化,以进行“干净”转换。

刚刚发现,尝试了以上一种方法后无效:=(:

对我来说非常有效。 为了在到期时给予信用,我在这里找到了它:

它不会工作,因为我们的char数组不存储直接长值,它存储在字节中,谢谢你的回答。你的例子是正确的。在我的例子中,它不是长数据,而是它存储的字节,所以这个解决方案对MIT不起作用,也按照C++标准,未定义的行为。@jalf这是一个C问题。@NickWiggill很公平。根据C标准,这也是未定义的行为。:)这不是在GCC和MS编译器下的UB。我很确定。它可能是由C STD.^编译器所做的实际上并不是关于标准所说的信息,尽管你恰巧是正确的。@ Jalf No,C通过C< >代码>联盟> <代码>,在C99中明确规定:C++没有继承这个,但是这是WRO。ng、混叠错误和可能的未定义错误对齐行为这是错误的、混叠错误和可能的未定义错误对齐行为我尝试了你的示例,但它对我无效。所做的是非常类似的:
char*vIn=“0”;long vOut=strtol(vIn,NULL,10);
@Beezer做了一件非常不同的事情:你的方法将文本解析为一个数字,而我的方法将缓冲区的字节解释为一个长字节。这些是不同的问题。
union {
 unsigned char c[4];
 long l;
} conv;

conv.l = 0xABC;
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];
    char * vIn = "0";
    long vOut = strtol(vIn,NULL,10);