16 进制 string转dword思考

#include <stdio.h>
#include <string.h>
#include <windef.h>
#include <windows.h>


DWORD string_to_hex (const char *str);

int main (void)
{

	char str[] = "0xff23";

	DWORD num = string_to_hex(str);

	printf ("0x%x\n",num);

	return 0;
}


DWORD string_to_hex (const char *str)
{
	int   i = 0;
	char  *index = "0123456789abcdef";				//记录查找索引
	char  *temp  = strdup(str);						//copy str
	char  *lower = strlwr(temp);
	char  *find  = NULL;
	DWORD dword = 0;

	if (strstr(lower,"0x")) {						//检测"ox"标记
		strcpy(lower,lower+2);
	}


	while (i < strlen(lower)) {
	
		find = strchr(index,lower[i]);

		dword = dword ^ (((DWORD)(find-index)) << ((strlen(lower)-1-i)*4));

		i++;
	}

	return dword;

}
这个一个将16进制字符串转成dword的函数实现,最近一直在做内存方面的工作,内存中,地址是dword的形式,而且方便的形式是16进制,所以总需要把字符串的地址转换成dword形式,这个函数可以方便的实现这个功能。下面来分析一下:
1.分析程序
先看这个*index ,这是一个索引,利用这个索引可以方便的求出字符串中的某一个数字的int值,比如一个字符串中的3,我们首先现在index中搜索,找到匹配它的地址,然后减去首地址,这样3这个int值就会求出来,当然,前提是索引必须有顺序。。然后看看那个移位异或操作,先是求出字符的int值,由于这个int值是16进制的,所以移位的时候不像是2进制那样移一次,这样需要移四次,所以有那个移动*4,为什么还需要乘以长度减一减索引i呢,由于每一个所求的字符都是不同位的,需要还原位,假设这个要转换的字符串是5位,那么它的第一个字符理应当在最高位,我们直接移动的时候需要移动4位,步长是刚才的*4,以此类推,就有第二个字符移动3位,正好,用刚才字符串长度-1 再减去索引 i 刚好就是那个值,所以我们用这个来移动,就可以达到求出每一个字符在这个要转换的字符串中的十六进制值得大小,最后需要把求出的所有加起来也就是合并这些转换后的,所以用异或,因为基本都是0101,需要把1合并,恰恰1对应的那位又是0,所以用异或,其实或也是可以的
2.深入思考
程序有两个亮点,一个是求一个字符的int值,一个是移位操作求大小,求字符int值,需要保证索引index的正确顺序,然后利用地址来减。而移位操作,需要理解,移1位乘2这个亘古不变的道理,乘16需要移4位,成8需要移3位,我相信通过我的讲解,大家可以把转8进制,二进制。

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值