开扒php内核函数,第一篇 bin2hex

这段时间真的比较有时间,因此本身用c写一下bin2hex啦php

写个php的人都知道,这是个比较熟悉的函数吧,没有什么高深,只是把输入的东西以16进制输出吧了函数

先分析一下,这个函数要怎么写吧,他会有必定的逻辑,那么他就有循环体和终结条件啦优化

咱们先看看怎样把一个数转为16进制吧3d

960 / 16 = 60 余数为 0blog

60 / 16 = 3 余数为 12内存

3 /16 = 0.XX 余数为 3ci

那么 960 的16进制 是 3c0get

image

从上面咱们能够看出当 商>=1的时候就不用再继续啦,而后 把上面的每个步骤倒转叠加就能够啦it

因而我写出了一下代码变量

image

为何用malloc,由于我实在找不到一个函数能够 用来单个字符链接,strcat又报错,因此只好用malloc

其实一开始 while(0) 这里我是写 while(q>=1)的,可是咱们有一个先知条件,就是ascii码是一个字节的,0到255

如下是我查的资料

1.ASCII中的0~31为控制字符;32~126为打印字符;127Delete(删除)命令

那么咱们就能够 写出 29,30行的代码啦,为何呢,由于已知ascii码不大于266,因此咱们能够肯定第一次的商就是第二次的模 ,因此有while(0)

运行下结果呢

image

 

答案是正确的,由于本身资质实在太差,因此想了半天才写了这个代码,其中找那个字符链接函数找了好久啦,

下面咱们来看看php是怎么实现的

image

image

瞬间高B格了不少了,原来个人代码是能够优化不少的

1 做者用了 register 寄存器变量,由于 result变量 在下面循环屡次引用,因此放在寄存器比放在内存快不止一个级别啊

2 做者用了一个j的变量来省去我上面 *2的代码消耗

  这里的知识点是 j++,做者用得太好啦,两行的j++ 就等于 我用 i*2 i*2+1,读者能够留心看一下

3 用 位运算符 代替我 上面的除法和取模运算,我感到至关自卑了  /16能够用向右移4位代替的,16/16 = 16>>4    而 %16能够用&运算符代替 255%15  = 255 & 15 = 15 = 0xf

4 做者把 hexconvtab放在外面 避免了函数屡次调用而分配屡次内存啦,static关键字只是让当前变量只能在当前代码页可用

以后的代码咱们占时能够不用理,咱们主要分析函数的主要部分,本身真的要多动手写,小看代码啊

相关文章
相关标签/搜索