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 <stdio.h>
#include <string.h>
#include <math.h>

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 <stdio.h>
#include <string.h>

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;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值