当前位置 : 主页 > 编程语言 > 其它开发 >

查看基本数据类型数据在内存中的存储表示小工具

来源:互联网 收集:自由互联 发布时间:2022-05-30
在写这个小工具之前我们先了解一下命令行参数。 命令行参数。 什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。 一般格式(运行应用程

在写这个小工具之前我们先了解一下命令行参数。

命令行参数。

什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。

一般格式(运行应用程序时) : 应用程序名 串1 串2 ...... 串n

按国际标准,c程序标准的main函数头只有两种:

1、不带命令行参数。
int main(void)
{
}
2、带命令行参数。
int main(int argc,char* argv[])
{
    //argc:命令行参数的个数 argument count
    //char *argv[]:argument vector数组,每个元素char* 字符串。
    //第二个参数也可以写成char** argv。
}

特别注意:c语言中命令行运行时:程序名 字符串1 字符串2 ...... 字符串n。

argv[0] = "程序名.exe" argv[1] = "字符串1" ...... argv[argc - 1] = "字符串n"。

查看基本数据类型数据在内存中的存储表示小工具
//显示一个字节的8位
void showByte(char ch)//参数:传入一个字节
{
	/*利用移位实现*/
	for (int i = 7; i >= 0; --i)
	{
		printf("%d",(ch >> i) & 1);//注意:对ch移位并不会改变ch原有的值,因为没有赋值
	}
	printf(" ");
}

void showByte(char ch, int n)//参数1:传入一个字节。参数2:输出一个字节要显示的位数
{
	/*利用递归实现*/
	if (n == 0)
	{
		printf(" ");
		return;
	}
	else
	{
		showByte(ch >> 1, n - 1);
		printf("%d",ch & 1);
	}
	
}


/*利用共用体和字段实现*/
union uct
{
	char ch;
	struct bt//字段
	{
		unsigned char b0 : 1;
		unsigned char b1 : 1;
		unsigned char b2 : 1;
		unsigned char b3 : 1;
		unsigned char b4 : 1;
		unsigned char b5 : 1;
		unsigned char b6 : 1;
		unsigned char b7 : 1;
	}bit;
}uc;
void showByte_a(char ch)//参数:传入一个字节
{
	uc.ch = ch;
	printf("%d%d%d%d%d%d%d%d ", uc.bit.b7, uc.bit.b6, uc.bit.b5, uc.bit.b4,
		uc.bit.b3, uc.bit.b2, uc.bit.b1, uc.bit.b0);
}


void showByte_b(char ch)//参数:传入一个字节
{
	/*利用查表法实现*/
	const char* t[] = { "0000","0001", "0010","0011",
	"0100","0101","0110","0111","1000","1001","1010",
	"1011","1100","1101","1110","1111" };
	printf("%s%s ", t[(ch >> 4) & 0xf], t[ch & 0xf]);//将传入的参数分为高四位与第四位,在表中查找相对应的值并输出
}


int main(int argc ,char* argv[])				
{
	/*用法: -h/-b char/short/int/long/long long/float/double 待查看的数据*/
	union //共用体
	{
		char ch[81];
		short s;
		int i;
		long l;
		long long ll;
		float f;
		double d;
	}u;

	int size = 1;	//	默认查看的数据占的字节数
	bool isBinary = 1;//默认为查看二进制

	if (!strcmp("-h", argv[1]))
	{
		//查看方式为-h,十六进制
		isBinary = 0;
	}
	else if(!strcmp("-b", argv[1]))
	{
		//查看方式为-b,二进制
		isBinary = 1;
	}

	if (!(argc == 4 || argc == 5))
	{
		printf("参数输入有误\n");
		exit(0);	//退出整个程序
	}
	//判断参数类型
	if (!strcmp("char", argv[2]))
	{
		strcpy(u.ch, argv[3]);
		size = strlen(u.ch);
	}
	else if(!strcmp("short",argv[2]))
	{
		u.s = atoi(argv[3]);
		size = sizeof(u.s);
	}
	else if (!strcmp("int", argv[2]))
	{
		u.i = atoi(argv[3]);
		size = sizeof(u.i);
	}
	else if (!strcmp("long", argv[2]) && !strcmp("long", argv[3]))
	{
		u.ll = atol(argv[4]);
		size = sizeof(u.ll);
	}
	else if (!strcmp("long", argv[2]))
	{
		u.l = atoll(argv[3]);
		size = sizeof(u.l);
	}
	else if (!strcmp("float", argv[2]))
	{
		u.f = atof(argv[3]);
		size = sizeof(u.f);
	}
	else if (!strcmp("short", argv[2]))
	{
		u.d = atof(argv[3]);
		size = sizeof(u.d);
	}

	/*
	//输出在内存中的表示
	if (!strcmp("char",argv[1]))
	{
		for (int i = 0; i < size; ++i)
		{
			printf("%02x ", u.ch[i] & 0xff);
		}
	}
	else
	{	//倒序输出是因为采用了小端机存储,如果正序输出数据就会反过来表示
		for (int i = size - 1; i >= 0; --i)
		{
			printf("%02x ", u.ch[i] & 0xff);
		}
	}
	*/

	//或者也可以使用指针输出
		if (!strcmp("char",argv[2]))//字符要分开输出,因为其他类型是用小端机存储,所以得倒序输出。
		{
			for (char* p = u.ch; p < u.ch + size ; ++p)
			{
				if (isBinary)
				{
					//二进制输出
					showByte_b(*p & 0xff);
				}
				else
				{
					//十六进制输出
					printf("%02x ", *p & 0xff);
				}
			}
		}
		else    //其他类型数据
		{	
			for (char* p = u.ch + size -1 ; p >= u.ch; --p)
			{
				if (isBinary)
				{
					//二进制输出
					showByte_b(*p & 0xff);
				}
				else
				{
					//十六进制输出
					printf("%02x ", *p & 0xff);
				}
			}
		}
	


	system("pause");
	return 0;
}
在vs里面如和输入命令行参数:

项目---》属性---》调试---》命令行参数;然后直接输入你要输入的命令行参数,然后就可以直接进行调试了

网友评论