二进制中的数学换算
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
二进制中的数学换算
接触二进制安全也比较久了,对于数值的换算应该很熟练,但是似乎一直找不到技巧,总是被各种单位、十进制/十六进制 换算苦恼。
如果给出一些时间可以让自己换算正确,但是在二进制学习中大量换算,这无疑会花费很多精力。
因此,就尝试写该篇博客,尝试找到如何快速换算的思路。
一、基本的单位换算:
Bit、字节、字、双字、四字、KB、MB、GB:
二、二进制与十六进制的思考方式:
十六进制与十进制最大的不同是:按位思考。
我们在进行十六进制计算时,不要按照十进制的思考模式去思考每一位的权值,而是直接拆分成二进制位数,转去对位个数的运算(四整数倍的换算)。
举个例子:
1)说起字节,我们如何通过十六进制来表示?
正确思考方式:一个字节,八个bit位,十进制角度为 2^8, 8/4 = 2 , 故两个十六进制就可以表示。
2)说起1GB,我们如何通过十六进制来表示?
正确思考方式:1GB,2^30,同理,30/4 = 7·····2,故 0x 2^2 * [000,0000] 即 0x4000,0000。
3)说起32位,其最大的值如何来表示?
正确思考方式:2^32 , 32/4 = 8,即 0x1,0000,0000 , 一般从零开始计算,则为 [0,0xFFFFFFFF]。
三、使用二进制、十进制还是十六进制:
如果认真分析完(二),会发现其实三者无关紧要。
二进制(x个位) -> 十进制(2^x) -> 十六进制(x/4),这条逻辑很清晰。
自己感觉难点存在两个,一个是在十进制中对2的幂运算,二是对于十六进制除以4的操作,这两个很容易忘记如何计算。
四、如何通过十六进制快速判断是多少字节多少位:
理解上面所讲的,这很好判断,比如一个寄存器中的值为 0x0019FFCC,其两个十六进制表示一个字节(8个bit),因此我们直接看位数为4字节,4*8 = 32 位,因此这个寄存器为32位寄存器。
所以这思路是先通过十六进制,位数除二换算成字节,字节再乘八换算成比特位得到处理位数。
五、总结
之后,如果再提到1GB,那么先想是 2 的多少位,之后再来分析到底是求十进制还是十六进制,十进制直接2的幂运算,十六进制直接除以4即可。
如果直接以16进制显示,则其位数除以2划分成字节,一字节对应8位,同时字、双字、四字之类的同理可以直接在十六进制基础上划分即可,如果感觉划不过来通过字节来进行划分。
主要是反应要快,快速得到结果。