有一段字符串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, 该怎么办?
转化成为字符串的话,表示范围最大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); }