无法拆分并将十六进制数存储在数组中

时间:2016-11-09 09:13:43

标签: c strtol

我想拆分这个hexstring,转换em,并将em存储在一个数组中。 但似乎我的工作中有一些东西,我不知道是什么。

我打算拆分这个字符串

  

27CA6B

 27
 CA
 6B

但输出始终只是第一个字符串。 像

27
51819
0

请有人帮忙,这是我的代码

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(void)
 {
char bc[] = "27CA6B";
char *theEnd;

long result;
long resulta;
long resultb;
long resultc;

result = strtol (bc, &theEnd, 0);
resulta = strtol (theEnd, &theEnd, 16 );
resultb = strtol (theEnd, NULL, 0);

//int i = 0;
//printf("%c%c%c%c%c%c\n", bc[0], bc[1], bc[2], bc[3], bc[4], bc[5]);

printf("%ld\n", result, &bc[0]);
printf("%ld\n", resulta, &bc[1]);
printf("%ld\n", resultb, &bc[2]);


return 0;
 }

2 个答案:

答案 0 :(得分:1)

&#34;问题&#34;你因为这条线而看到了

 resulta = strtol (theEnd, &theEnd, 16 );

那里,theEnd指向CA6B,根据基数16,它是一个有效的输入,因此整个字符串被消耗和转换。十进制表示值为51819,您将其视为输出。

实现这一目标的最佳方法是(根据您的方法)获取指向数组起始点的指针,并且&#34; clip&#34;它在备用索引上。

那就是说,所有printf()语句在逻辑上都是错误的,因为你只有一个格式说明符,但你提供了两个参数,所以最后一个语句将被静默忽略。

答案 1 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char bc[] = "27CA6B";
    unsigned char result[(sizeof(bc)-1)/2] = {0};
    int i = 0;

    for(char *p = bc; *p; p += 2){
        char part[3] = {0};
        memcpy(part, p, 2);//Extract 2 characters
        result[i++] = strtoul(part, NULL, 16);
    }

    for(i = 0; i < sizeof(result); ++i){
        printf("%3u %c%c\n", result[i], bc[i*2], bc[i*2+1]);
    }

    return 0;
}

展开循环

unsigned char result1,result2,result3;
int i = 0;
char part[3] = {0};

memcpy(part, bc + i, 2); i += 2;
result1 = strtoul(part, NULL, 16);
memcpy(part, bc + i, 2); i += 2;
result2 = strtoul(part, NULL, 16);
memcpy(part, bc + i, 2); i += 2;
result3 = strtoul(part, NULL, 16);

i = 0;
printf("%3u %c%c\n", result1, bc[i], bc[i+1]); i += 2;
printf("%3u %c%c\n", result2, bc[i], bc[i+1]); i += 2;
printf("%3u %c%c\n", result3, bc[i], bc[i+1]); i += 2;