开扒php内核函数,第一篇 bin2hex
这段时间真的比较有时间,所以自己用c写一下bin2hex啦 写个php的人都知道,这是个比较熟悉的函数吧,没有什么高深,只是把输入的东西以16进制输出吧了 先分析一下,这个函数要怎么写吧,他会有一定的逻辑,那么他就有循环体和终结条件啦 我们先看看怎样把一
这段时间真的比较有时间,所以自己用c写一下bin2hex啦
写个php的人都知道,这是个比较熟悉的函数吧,没有什么高深,只是把输入的东西以16进制输出吧了
先分析一下,这个函数要怎么写吧,他会有一定的逻辑,那么他就有循环体和终结条件啦
我们先看看怎样把一个数转为16进制吧
960 / 16 = 60 余数为 0
60 / 16 = 3 余数为 12
3 /16 = 0.XX 余数为 3
那么 960 的16进制 是 3c0
从上面我们可以看出当 商>=1的时候就不用再继续啦,然后 把上面的每一个步骤倒转叠加就可以啦
于是我写出了一下代码
为什么用malloc,因为我实在找不到一个函数可以 用来单个字符连接,strcat又报错,所以只好用malloc
其实一开始 while(0) 这里我是写 while(q>=1)的,但是我们有一个先知条件,就是ascii码是一个字节的,0到255
以下是我查的资料
1.ASCII中的0~31为控制字符;32~126为打印字符;127为Delete(删除)命令
那么我们就可以 写出 29,30行的代码啦,为什么呢,因为已知ascii码不大于266,所以我们可以确定第一次的商就是第二次的模 ,所以有while(0)
运行下结果呢
答案是正确的,因为自己资质实在太差,所以想了半天才写了这个代码,其中找那个字符连接函数找了很久啦,
下面我们来看看php是怎么实现的
瞬间高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关键字只是让当前变量只能在当前代码页可用
之后的代码我们占时可以不用理,我们主要分析函数的主要部分,自己真的要多动手写,小看代码啊
上一篇: PHP版QQ互联OAuth示例代码分享
下一篇: php下实现农历日历的代码_php实例