user-0 提问: 二进制和字符有什么关系，如何转化的

回复:
user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 感谢老师~~我去试一试~~~

user: user-0
content: 引用 7 楼 qq423399099 的回复:这样？  #include<iostream> #include<bitset> using namespace std;  int main() {        	for(int i = 0; i <= 255; i++) 		cout << bitset<8>(i)  << endl; }   就想要这个效果的，，不过C有办法实现么。。

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉   再供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-2
content: 这个可以有啊，C 中有个随机字符，可以考虑，用用啊，这种穷举忒好破译了，有规律。

user: user-3
content: 这样？  #include<iostream> #include<bitset> using namespace std;  int main() {        	for(int i = 0; i <= 255; i++) 		cout << bitset<8>(i)  << endl; }

user: user-0
content: 引用 13 楼 qq423399099 的回复:不妨用itoa  #include <stdlib.h>  #include <stdio.h>  int main(void)  {  	int i; 	char str[9]; 	for(i = 0; i <= 255; i++) 	{ 		itoa(i, str, 2);  		printf("%s\n", str);  	} }  和zhao4zhong1老师给的参考很近似的~好用的！~多谢多谢~~~~

user: user-3
content: 不妨用itoa  #include <stdlib.h>  #include <stdio.h>  int main(void)  {  	int i; 	char str[9]; 	for(i = 0; i <= 255; i++) 	{ 		itoa(i, str, 2);  		printf("%s\n", str);  	} }

user: user-0
content: 引用 4 楼 lm_whales 的回复:0~0xff 就可以了 您好~那您说的方法怎么实现呢，最好有一两行代码吧，拜托拜托啦~

user: user-0
content: 引用 3 楼 github_27756899 的回复:[quote=引用 2 楼 zyx1202 的回复:] [quote=引用 1 楼 github_27756899 的回复:] #include <stdio.h>  int main(void) { 	unsigned char key[8] = {0};           //以第一个字节为例: 	while(key[0] < 255 ) 	{ 		printf("%d\n",key[0]); 		key[0]++; 	} 	printf("%d\n",key[0]); 	return 0; } 感谢这段代码。可以解释一下原理么。。。话说我的基础学得好渣。。[/quote] char 占一个字节(8位)  默认有符号 第一位是符号位  因此其范围为:(-128~127)   用unsigned 修饰将其变为无符号的 因此其范围为:(0~255) 本例中 先初始化8个unsigned char 为0     后将第一字节从0  一直加到 255 并输出. 希望我已经大概讲明.   不懂继续交流.[/quote] 已经明白啦~多谢多谢

user: user-4
content: 0~0xff 就可以了

user: user-5
content: 引用 2 楼 zyx1202 的回复:[quote=引用 1 楼 github_27756899 的回复:] #include <stdio.h>  int main(void) { 	unsigned char key[8] = {0};           //以第一个字节为例: 	while(key[0] < 255 ) 	{ 		printf("%d\n",key[0]); 		key[0]++; 	} 	printf("%d\n",key[0]); 	return 0; } 感谢这段代码。可以解释一下原理么。。。话说我的基础学得好渣。。[/quote] char 占一个字节(8位)  默认有符号 第一位是符号位  因此其范围为:(-128~127)   用unsigned 修饰将其变为无符号的 因此其范围为:(0~255) 本例中 先初始化8个unsigned char 为0     后将第一字节从0  一直加到 255 并输出. 希望我已经大概讲明.   不懂继续交流.

user: user-0
content: 引用 1 楼 github_27756899 的回复:#include <stdio.h>  int main(void) { 	unsigned char key[8] = {0};           //以第一个字节为例: 	while(key[0] < 255 ) 	{ 		printf("%d\n",key[0]); 		key[0]++; 	} 	printf("%d\n",key[0]); 	return 0; } 感谢这段代码。可以解释一下原理么。。。话说我的基础学得好渣。。

user: user-5
content: #include <stdio.h>  int main(void) { 	unsigned char key[8] = {0};           //以第一个字节为例: 	while(key[0] < 255 ) 	{ 		printf("%d\n",key[0]); 		key[0]++; 	} 	printf("%d\n",key[0]); 	return 0; }