在C中将Char数组转换为Long

5m1hhzi4  于 2023-10-16  发布在  其他
关注(0)|答案(9)|浏览(196)

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

  1. void ConvertLongToChar(char *pSrc, char *pDest)
  2. {
  3. pDest[0] = pSrc[0];
  4. pDest[1] = pSrc[1];
  5. pDest[2] = pSrc[2];
  6. pDest[3] = pSrc[3];
  7. }

我这样调用上面的函数

  1. long lTemp = (long) (fRxPower * 1000);
  2. ConvertLongToChar ((char *)&lTemp, pBuffer);

这很好。我需要一个类似的函数来反转这个过程。将char数组转换为long。我不能使用atol或类似的功能。

iaqfqrcu

iaqfqrcu1#

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

  1. unsigned long int l = pdest[0] | (pdest[1] << 8) | (pdest[2] << 16) | (pdest[3] << 24);

为了安全起见,下面是相应的另一个方向:

  1. unsigned char pdest[4];
  2. unsigned long int l;
  3. pdest[0] = l & 0xFF;
  4. pdest[1] = (l >> 8) & 0xFF;
  5. pdest[2] = (l >> 16) & 0xFF;
  6. pdest[3] = (l >> 24) & 0xFF;

char[4]到long再返回是完全可逆的;从long到char[4]再返回,对于最大值2^32-1是可逆的。
请注意,所有这些都只对无符号类型定义良好。
(My例如,如果从左到右读取pdest,则为 little endian。)

  • 附录:* 我也假设CHAR_BIT == 8。一般来说,在代码中将8的倍数替换为CHAR_BIT的倍数。
展开查看全部
8qgya5xd

8qgya5xd2#

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

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

但是,这并没有考虑到字节序,所以如果您必须在多台计算机之间共享数据,请小心。

owfi6suc

owfi6suc3#

您可以执行以下操作:

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

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

ev7lccsx

ev7lccsx4#

如果你想把sizeof (long)字节的内存作为一个单一的长,那么你应该做下面的事情:

  1. char char_arr[sizeof(long)];
  2. long l;
  3. memcpy (&l, char_arr, sizeof (long));

这件事可以通过粘贴每个字节的长使用位移动和粘贴,如下所示。

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

如果你想将“1234\0”字符串转换为1234L,那么你应该

  1. l = strtol (char_arr, NULL, 10); /* to interpret the base as decimal */
展开查看全部
92vpleto

92vpleto5#

这是否有效:

  1. #include<stdio.h>
  2. long ConvertCharToLong(char *pSrc) {
  3. int i=1;
  4. long result = (int)pSrc[0] - '0';
  5. while(i<strlen(pSrc)){
  6. result = result * 10 + ((int)pSrc[i] - '0');
  7. ++i;
  8. }
  9. return result;
  10. }
  11. int main() {
  12. char* str = "34878";
  13. printf("The answer is %d",ConvertCharToLong(str));
  14. return 0;
  15. }
展开查看全部
2uluyalo

2uluyalo6#

  1. unsigned long long convert_achar_to_unsigned_long_long(char *src) {
  2. unsigned long long ret = 0;
  3. char digit[2];
  4. digit[1] = '\0';
  5. byte n = 0;
  6. while(src[n] != '\0') {
  7. digit[0] = src[n];
  8. if(n!=0) {
  9. ret *= 10;
  10. }
  11. ret += atoi(digit);
  12. n++;
  13. }
  14. return ret;
  15. }
ercv8c1e

ercv8c1e7#

这是肮脏的,但它的工作:

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

uqjltbpv8#

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

小心以null结尾的字符串,因为您最终会将null结束符以外的任何字节复制到combined中;因此,在上面的分配中,charArray需要被完全零初始化以用于“干净”转换。

a6b3iqyw

a6b3iqyw9#

刚刚发现这个尝试了以上的一个以上都无济于事:=(:

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

对我来说效果很好。为了给予应有的赞扬,我在这里找到了它:https://www.convertdatatypes.com/Convert-char-Array-to-long-in-C.html

相关问题