user-0 提问: C语言实现 字符串转化为 16进制整形数据？

回复:
user: user-1
content: 引用 25 楼 sholber 的回复:[quote=引用 24 楼 vnvlyp 的回复:] [quote=引用 18 楼 sholber 的回复:] [quote=引用 16 楼 vnvlyp 的回复:] [quote=引用 10 楼 sholber 的回复:] 多数字符都都兼容ASCII，但也有个别例外。最典型的就是 EBCDIC，字符f的编码是134。而且，英文字母在表中并不是连续的，但好在C并没有规定a~z和A~Z必须连续，只规定'0'~'9'必须是连续的。 EBCDIC也就IBM古董机之类的才用吧。。现代计算机还没有不支持或兼容ASCII的吧？[/quote] 制定C标准的时候估计发生过类似的争论。。。但实际上是，C要求的是兼容并蓄，不是因为多就无视少。很多错误和事故就是因为当初觉得不可能发生。[/quote] 我的意思是除非你是专门给古董机写程序，不然考虑这个问题没有必要吧。。反正你现在写的程序也不可能放到什么古董机上运行[/quote] 这种认识是不对的。 1，那不是古董。计算机行业里，谁也说不准哪天会碰到，或者需要一些特殊的机器，有可能是新造的。流行不代表“新”，偏门的应用不代表“旧”。有需求的地方，什么事情都会发生。哪天有个大老板出100万让你写一个程序，它的目标小设备就是个奇怪的字符集（符合C标准要求，但不兼容ASCII），你说那是古董机，爷不挣这个钱？ 2，如果你的代码不是可移值的，不是依从C标准的，应当有所说明。就像微软的软件，适用什么处理器，多大内存需求，需要什么操作系统支持之类的。如果不说明，只因为流行，这是误导。本来学生们视界就窄，如果顺势错误地鼓励而不是告诉他们实际是什么情况，他们一辈子就怀着错误的认识写程序。[/quote] 新造的机器除非是某些特定行业用的微控什么的不需要ASCII，不然没有必要故意去不兼容ASCII吧？除非你从底层硬件，操作系统开始做一套全新的系统，不然现行广泛采用的解决方法还没有不支持ASCII的吧？但是谁又会放弃几十年的开发积累又从空白开始做起？ 至于C标准和可移植性，这个问题我觉得是有争议的，第一，选择只兼容那些兼容ASCII的字符集，在移植性上我觉得没有什么大问题，因为基本上能跑现代程序的也都兼容ASCII，第二，完全兼容C标准我觉得在现实中代价太大，更普遍的是针对特定群体开发，特别是当程序达到一定规模基本上就不可能完全兼容所有C认为需要兼容的系统和机器，第三，至于误导初学者这个不能叫误导吧？比如你肯定不会在崎岖不平的路上教小孩走路，平路都走不稳怎么走得好各种坑洼，但是不是代表着在平路上教走路就是误导呢？或者在平路上学会走路的以后在不平的路上走就会摔死呢？初学者基本概念都不清楚，你就说要考虑这考虑那，那基本上也只是莫名其妙完全不知所云，这些问题随着学习深入再接触也不是什么大问题吧？如果他们一辈子再也没接触到这个问题，怀着不完整的观点写程序，那也只能说是个人造化问题，毕竟水平是会有三六九等的。

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-1
content: 引用 18 楼 sholber 的回复:[quote=引用 16 楼 vnvlyp 的回复:] [quote=引用 10 楼 sholber 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 多数字符都都兼容ASCII，但也有个别例外。最典型的就是 EBCDIC，字符f的编码是134。而且，英文字母在表中并不是连续的，但好在C并没有规定a~z和A~Z必须连续，只规定'0'~'9'必须是连续的。[/quote] EBCDIC也就IBM古董机之类的才用吧。。现代计算机还没有不支持或兼容ASCII的吧？[/quote] 制定C标准的时候估计发生过类似的争论。。。但实际上是，C要求的是兼容并蓄，不是因为多就无视少。很多错误和事故就是因为当初觉得不可能发生。[/quote] 我的意思是除非你是专门给古董机写程序，不然考虑这个问题没有必要吧。。反正你现在写的程序也不可能放到什么古董机上运行

user: user-3
content: 引用 24 楼 vnvlyp 的回复:[quote=引用 18 楼 sholber 的回复:] [quote=引用 16 楼 vnvlyp 的回复:] [quote=引用 10 楼 sholber 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 多数字符都都兼容ASCII，但也有个别例外。最典型的就是 EBCDIC，字符f的编码是134。而且，英文字母在表中并不是连续的，但好在C并没有规定a~z和A~Z必须连续，只规定'0'~'9'必须是连续的。[/quote] EBCDIC也就IBM古董机之类的才用吧。。现代计算机还没有不支持或兼容ASCII的吧？[/quote] 制定C标准的时候估计发生过类似的争论。。。但实际上是，C要求的是兼容并蓄，不是因为多就无视少。很多错误和事故就是因为当初觉得不可能发生。[/quote] 我的意思是除非你是专门给古董机写程序，不然考虑这个问题没有必要吧。。反正你现在写的程序也不可能放到什么古董机上运行[/quote] 这种认识是不对的。 1，那不是古董。计算机行业里，谁也说不准哪天会碰到，或者需要一些特殊的机器，有可能是新造的。流行不代表“新”，偏门的应用不代表“旧”。有需求的地方，什么事情都会发生。哪天有个大老板出100万让你写一个程序，它的目标小设备就是个奇怪的字符集（符合C标准要求，但不兼容ASCII），你说那是古董机，爷不挣这个钱？ 2，如果你的代码不是可移值的，不是依从C标准的，应当有所说明。就像微软的软件，适用什么处理器，多大内存需求，需要什么操作系统支持之类的。如果不说明，只因为流行，这是误导。本来学生们视界就窄，如果顺势错误地鼓励而不是告诉他们实际是什么情况，他们一辈子就怀着错误的认识写程序。

user: user-4
content: http://goobbe.com/questions/1149277/how-to-convert-string-to-hexadecimal

user: user-0
content: 引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  是这个意思。

user: user-0
content: 引用 5 楼 user-9 的回复: int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 5 楼 user-9 的回复: int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }   谢谢，我试一试

user: user-5
content: #include <stdio.h> #include <stdlib.h>  int main() {     char buffer[20];     long n;     FILE* fp;     fp = fopen("test.txt","r");     FILE* out = fopen("out.txt","w");     if(!fp)     {         fprintf(stderr , "can`t open file\n");         exit(0);     }     while((fscanf(fp , "%s" , buffer))== 1)           {               sscanf(buffer , "%x" , &n);               fprintf(out,"%-5d\n" , n);           }     fclose(fp);     fclose(out);     printf("%d\n",n);     return 0; }

user: user-5
content: #include <stdio.h>  int main() {     char buffer[20];     long n;     fgets(buffer , 19 , stdin);     sscanf(buffer, "%x" , &n);     printf("%d\n",n);     return 0; }

user: user-3
content: 引用 16 楼 vnvlyp 的回复:[quote=引用 10 楼 sholber 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 多数字符都都兼容ASCII，但也有个别例外。最典型的就是 EBCDIC，字符f的编码是134。而且，英文字母在表中并不是连续的，但好在C并没有规定a~z和A~Z必须连续，只规定'0'~'9'必须是连续的。[/quote] EBCDIC也就IBM古董机之类的才用吧。。现代计算机还没有不支持或兼容ASCII的吧？[/quote] 制定C标准的时候估计发生过类似的争论。。。但实际上是，C要求的是兼容并蓄，不是因为多就无视少。很多错误和事故就是因为当初觉得不可能发生。

user: user-3
content: 引用 11 楼 user-9 的回复:[quote=引用 9 楼 jiht594 的回复:] [quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 我收回我说的话,承认错误. 确实没遇见过非ascii编码的[/quote] 如果你想要非ASCII编码的话，可以用全角的数字和字母，虽然数字和字母各自依然还是连续的。[/quote] 两回事。 你想得简单了。你可能还没听说过基本字符集和扩展字符集。C要求基本字符集里必须至少包含哪些字符，但还没要求基本字符集里有什么全角半角字符。

user: user-1
content: 引用 10 楼 sholber 的回复:[quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 多数字符都都兼容ASCII，但也有个别例外。最典型的就是 EBCDIC，字符f的编码是134。而且，英文字母在表中并不是连续的，但好在C并没有规定a~z和A~Z必须连续，只规定'0'~'9'必须是连续的。[/quote] EBCDIC也就IBM古董机之类的才用吧。。现代计算机还没有不支持或兼容ASCII的吧？

user: user-6
content: 仅供参考：  #include <stdlib.h> #include <stdio.h> int main(void) { 	char *str = "f2"; 	puts(str); 	char *e; 	long l = strtol(str, &e, 16);  //字符串转十进制 	printf("l=%d\n", l); 	char dest[9]; 	_ltoa(l, dest, 16);   //十进制整数转十六进制 	printf("dest=%s\n", dest); 	return 0; } //f2 //l=242 //dest=f2

user: user-6
content: 仅供参考：  #include<stdio.h> int main(void)   //13 { 	char *str = "f2"; 	puts(str); 	long l; 	sscanf(str, "%x", &l);   //字符串转十进制 	printf("l=%d\n", l);     //按十进制打印 	printf("l=%x\n", l);     //按十六进制打印 	system("pause"); 	return 0; } //f2 //l=242 //l=f2

user: user-7
content: 引用 11 楼 user-9 的回复:如果你想要非ASCII编码的话，可以用全角的数字和字母，虽然数字和字母各自依然还是连续的。 这个也算是.  我的意思是那种默认的编码?

user: user-8
content: (*str&~0x20)转小写差点没看出来，就差值域检测了

user: user-9
content: 引用 9 楼 jiht594 的回复:[quote=引用 8 楼 jiht594 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 我收回我说的话,承认错误. 确实没遇见过非ascii编码的[/quote] 如果你想要非ASCII编码的话，可以用全角的数字和字母，虽然数字和字母各自依然还是连续的。

user: user-3
content: 引用 8 楼 jiht594 的回复:[quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 多数字符都都兼容ASCII，但也有个别例外。最典型的就是 EBCDIC，字符f的编码是134。而且，英文字母在表中并不是连续的，但好在C并没有规定a~z和A~Z必须连续，只规定'0'~'9'必须是连续的。

user: user-7
content: 引用 8 楼 jiht594 的回复:[quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教[/quote] 我收回我说的话,承认错误. 确实没遇见过非ascii编码的

user: user-7
content: 引用 7 楼 sholber 的回复:[quote=引用 5 楼 user-9 的回复:]  int str2int(char *str) { 	int n=0; 	while(*str) 	{ 		n<<=4; 		if(*str<='9') 			n|=*str-'0'; 		else 			n|=(*str&~0x20)-'A'+10; 		++str; 	} 	return n; }  引用 6 楼 jiht594 的回复:正常来说, 字符'f'对应十进制101, 十六进制的0x66  你想把f变成十进制的15(也就是16进制的0xf)??  你们是在讨论ASCII？ C没规定必须用 ASCII，也没说26个英文字母在字符集中必须连续。除非楼主说就限定使用ASCII的转换环境和执行环境。[/quote]  不好意思.  我接触的c/c++, 也就是咱们这个论坛的名字, 字符串中的f不是十进制101, 十六进制的0x66吗?? 求教