Heim  >  Artikel  >  php教程  >  开扒php内核函数,第一篇 bin2hex

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

WBOY
WBOYOriginal
2016-06-06 19:42:241098Durchsuche

这段时间真的比较有时间,所以自己用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

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

从上面我们可以看出当 商>=1的时候就不用再继续啦,然后 把上面的每一个步骤倒转叠加就可以啦

于是我写出了一下代码

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

为什么用malloc,因为我实在找不到一个函数可以 用来单个字符连接,strcat又报错,所以只好用malloc

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

以下是我查的资料

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

那么我们就可以 写出 29,30行的代码啦,为什么呢,因为已知ascii码不大于266,所以我们可以确定第一次的商就是第二次的模 ,所以有while(0)

运行下结果呢

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

 

答案是正确的,因为自己资质实在太差,所以想了半天才写了这个代码,其中找那个字符连接函数找了很久啦,

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

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

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

瞬间高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关键字只是让当前变量只能在当前代码页可用

之后的代码我们占时可以不用理,我们主要分析函数的主要部分,自己真的要多动手写,小看代码啊

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn