字符串格式转化

Question:

有一段字符串char* a,如“6f36323d313536303030......”其实它隐含着十六进制信息。比如3f对应于char是‘o’,对应于整形是63,其ascii是6f。36对应char是‘6’,对于整形是54,其ascii是36。

现要将这个字符串压缩成另一个字符串char* b;如上面的char* b应该是"o62=156000......",请问具体怎么实现。

我知道在内存中整形和字符型是一样的。如(int) 48 就是 (char)‘0’
也可以用类似sscanf(strbuf, "%2d", &k),转化成整形,在用十位乘16+个位的形式计算;输出字符便可以得到如‘0’~‘9’间的字符数据。但是如果出现字母的话便不能处理。如遇到6f,3d, 该怎么办?

Answer:

转化成为字符串的话,表示范围最大256 用十六进制表示的话最多2位, 也就是说每两位转化成对应的字符。 这个需要自己来写。
就是读 char * a 每读两位然后转一次,然后放到b字符串中即可。

方法一:

#include <stdio.h>

int main()
{
char str[] = "6f36323d313536303030";
char *p;
char ch;
char result[20];
int i = 0;

for(p=str; *p; p+=2)
{
sscanf(p, "%2x", &ch);
result[i++] = ch;
}
result[i] = '\0';
puts(result);

return 0;
} 

方法二:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *a="6f36323d313536303030";
char *ptr,buf[3];
int i,len=0;;
char b[128];
ptr=a;
memset(b,0,sizeof(b));
while(ptr)
{
memset(buf,0,sizeof(buf));
strncpy(buf,ptr,2);
i=strtol(buf, (char **)NULL, 16);
printf("%s\n",buf);
memset(buf,0,sizeof(buf));
sprintf(buf,"%c",i);
strcat(b,buf);
ptr+=2;
len+=2;
if(len>strlen(a))break;
}
printf("%s\n",b);
}

你可能感兴趣的:(字符串格式转化)