登录  /  注册
首页 > php教程 > php手册 > 正文

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

php中文网
发布: 2016-06-06 19:42:24
原创
973人浏览过

这段时间真的比较有时间,所以自己用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关键字只是让当前变量只能在当前代码页可用

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

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号