user-0 提问: 字符串中16进制数据转换成字符串

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> char str[100] = "EB4D67E8F2FCE45F613144876EF8D1B9"; char bin[50]; int i,v,L; int main() {     L=strlen(str);     for (i=0;i<L/2;i++) {         sscanf(str+i*2,"%2X",&v);         bin[i]=(char)v;         printf("%02X ",(unsigned char)bin[i]);     }     return 0; } //EB 4D 67 E8 F2 FC E4 5F 61 31 44 87 6E F8 D1 B9  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 老师，再请教十六进制转换成字符串，怎样，下面写得有哪里不合适吗？  char buf[10]; char bin[50] = {0x,ab,0xbc,0xcd}; char str[100]; len = strlen(bin);  for (i = 0; i < len; i++) {        sprintf(buf,"%s",bin[i]);         strcat(str,buf); }

user: user-1
content: char bin[50] = {0xab,0xbc,0xcd}; char str[100]; for (i = 0; i < 3; i++) {     sprintf(str+i*2,"%02X",(unsigned char)bin[i]); }

user: user-2
content: 将每一个字符处理成对应16进制的数值，将数值高位和低位做逻辑加运算。示例如下： const char str[]  = "EB4D67E8F2FCE45F613144876EF8D1B9";  const int targLen = sizeof(str)*0.5;  unsigned char _CharTo16Num( const char c ) { 	if( c<65 ) 	{ 		return c-48;//0-9 	} 	else 	{ 		return c-65+10;// 10-15 	} } void _converTest() { 	unsigned char targ[targLen]={};  	for( int i=0,j=0;i< sizeof(str);i+=2,j++) 	{ 		targ[j] = _CharTo16Num( str[i] )<<4|_CharTo16Num(str[i+1] );  		printf("%x\t",targ[j]); 	} 	 }

user: user-1
content: #include <stdio.h> #include <string.h> char str[100] = "EB4D67E8F2FCE45F613144876EF8D1B9"; char bin[50]; int i,v,L; int main() {     L=strlen(str);     for (i=0;i<L/2;i++) {         sscanf(str+i*2,"%2X",&v);         bin[i]=(char)v;         printf("%02X ",(unsigned char)bin[i]);     }     return 0; } //EB 4D 67 E8 F2 FC E4 5F 61 31 44 87 6E F8 D1 B9  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-3
content: #include <stdio.h> #include <string.h>   int s2h(const char *s, char *h) {     int i, n;     char *p;      static unsigned char t[256] = {          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,    /* 0-9 */          0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /* A-F */          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /* a-f */          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0     };      p = h;     n = strlen(s);     if (n % 2) {         h[0] = t[(unsigned char)s[0]];         ++p;         ++s;     }      for (i = 0; i < n; i = i + 2) {         *(p++) = (t[(unsigned char)s[i]] << 4) | t[(unsigned char)s[i + 1]];     }      return (n + 1) / 2; }  int main(int argc, char *argv[]) {     char s[] = "EB4D67E8F2FCE45F613144876EF8D1B9";     char h[1024];     int i, n;      n = s2h(s, h);     for (i = 0; i < n; ++i) {         printf("%02x", (unsigned char)h[i]);     }     printf("\n");      return 0; }

user: user-1
content: 引用 6 楼 user-3 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <string.h> char str[100] = "EB4D67E8F2FCE45F613144876EF8D1B9"; char bin[50]; int i,v,L; int main() {     L=strlen(str);     for (i=0;i<L/2;i++) {         sscanf(str+i*2,"%2X",&v);         bin[i]=(char)v;         printf("%02X ",(unsigned char)bin[i]);     }     return 0; } //EB 4D 67 E8 F2 FC E4 5F 61 31 44 87 6E F8 D1 B9  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 从来不用scanf的路过[/quote] 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。 试试不用scanf实现和下面程序功能完全一样的功能： #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-3
content: 引用 2 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> char str[100] = "EB4D67E8F2FCE45F613144876EF8D1B9"; char bin[50]; int i,v,L; int main() {     L=strlen(str);     for (i=0;i<L/2;i++) {         sscanf(str+i*2,"%2X",&v);         bin[i]=(char)v;         printf("%02X ",(unsigned char)bin[i]);     }     return 0; } //EB 4D 67 E8 F2 FC E4 5F 61 31 44 87 6E F8 D1 B9  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 从来不用scanf的路过

user: user-0
content: 多谢各位回复

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> char str[100] = "EB4D67E8F2FCE45F613144876EF8D1B9"; char bin[50]; int i,v,L; int main() {     L=strlen(str);     for (i=0;i<L/2;i++) {         sscanf(str+i*2,"%2X",&v);         bin[i]=(char)v;         printf("%02X ",(unsigned char)bin[i]);     }     return 0; } //EB 4D 67 E8 F2 FC E4 5F 61 31 44 87 6E F8 D1 B9  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 多谢老师指教