C语言中十六进制字符串处理以及分析

通过命令行传递十六进制字符串参数
程序运行 ./test_main 0x12345678
方法1:每一字节存在一个char里 方法2:直接转成10进制数

int main(int argc, char** argv)
{
	unsigned char tmp;
	unsigned char match[64];
	char *str;
	int i;
	
	memset(match, 0, 64);
	str = argv[1];
	if (str[0] == '0' && str[1] == 'x')
	{
		str += 2;
	}

	for (i = 0; i< strlen(str); i ++)
	{
		if ('0' <= str[i] && str[i] <= '9')
		{
			tmp = str[i] - '0';
		}
		else if ('a' <= str[i] && str[i] <= 'f')
		{
			tmp = str[i] - 'a' + 10;
		}
		else if ('A' <= str[i] && str[i] <= 'F')
		{
			tmp = str[i] - 'A' + 10;
		}
		else 
		{
			printf("input error! %s\n", str);
		}

		if (0 == i % 2)
		{	// 第一次循环走这里tmp二进制表示为 0000 0001 				 
			match[i/2] = tmp << 4;        // match[0]   为0001 0000
		}
		else
		{
			//第二次循环走这里tmp二进制表示为 0000 0010    
			match[i/2] |= tmp;           //  match[0]为 0001 0010 即  0x12
		}


	}
	for (i = 0; i < 64; i++)
	{
		printf("0x%02x\n",match[i]);
	}
	return 0;
}
//程序打印结果为 0x12 0x34 0x56 0x78 ....

方法2

#include 
#include 
#include 

int char_to_hex(char *byte)
{
	int tmp = 0;
	if('0' <= *byte && *byte <= '9')
		tmp = *byte - '0';
	else if('a' <= *byte && *byte <= 'f')
		tmp = *byte - 'a' + 10;
	else if('A' <= *byte && *byte <= 'F')
		tmp = *byte - 'A' + 10;
	else
		return -1;		
	return tmp;
}
int main(int argc, char** argv)
{
	unsigned int total=0; 
	unsigned char tmp;

	char *str;
	int i;
	

	str = argv[1];
	if (str[0] == '0' && str[1] == 'x')
	{
		str += 2;
	}

	for (i = 0; i< strlen(str); i ++)
	{
		tmp = char_to_hex(str);
		total+=  tmp * pow(16,strlen(str)-i-1); 
		str++;


	}
	printf("total = %08x\n",total);
	return 0;
} 

方法3:

#include 
#include 

int main(int argc, char** argv)
{
	unsigned int total=0; 
	unsigned char tmp;
	char *str;
	
	str = argv[1];

	/*直接将16进制字符串转成整形*/
	total = strtol(str, NULL, 16);
	
	return 0;
}

你可能感兴趣的:(c,字符串,linux,c语言)