开扒php内核函数,第一篇 bin2hex
这段时间真的比较有时间,所以自己用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内核函数,第一篇 bin2hex的更多相关文章
- 开扒php内核函数,第二篇 hex2bin
从上一篇我们得知怎样把ascii变成16进制显示,这篇我们是怎样把16进制变成ascii显示 我们还是从分析开始吧 先看这个函数的介绍吧 string hex2bin ( string $data ) ...
- 开扒php内核函数,第三篇 implode
一开始觉得implode挺容易实现,但是写着写着才发现是挺复杂的,不说啦 来看看implode的用法吧 <?php $arr = array('Hello','World!','Beautifu ...
- lua学习之深入函数第一篇
深入函数第一篇 函数是第一类值,具有特定的词法域 第一类值 第一类值的意思是函数与 lua 中的其他类型如数字,字符串具有相同的权力 函数可以存储到全局变量或局部变量变量,还可以存储到 table 中 ...
- python之函数第一篇
一.为什么用函数: 解决代码重用问题 统一维护 程序的组织结构清晰,可读性强二.定义函数 先定义后使用!! def funcname(arg1,arg2,...): """ ...
- 华为LiteOS系统使用-任务调度函数-第一篇
1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...
- 开博客这么久以来,第一篇技术文章,python与c的接口对接
在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧.内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助.闲话少叙,开始正文. ...
- linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
- 深入理解javascript函数系列第一篇——函数概述
× 目录 [1]定义 [2]返回值 [3]调用 前面的话 函数对任何一门语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即 ...
- 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?
第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...
随机推荐
- Mac 版 QQ 可直接访问 iPhone 的相册 ?!
在QQ的聊天窗口中,点击 发送图片 的按钮,会有两个选择项,其中一个就是 从iPhone相册中选取 ,如图 点击 从iPhone相册中选取 后,iPhone上的QQ会收到一条消息 “请选择要上传的照 ...
- 甲骨文推出MySQL Fabric,简化MySQL的高可用性与可扩展性
北京,2014年5月28日——为了满足当下对Web及云应用需求,甲骨文宣布推出MySQL Fabric.MySQL Fabric是一款可简化管理MySQL数据库群的整合式系统.该产品通过故障检测和故障 ...
- 将Android Studio工程导入到Eclipse中
1.前言 studio项目中src/main/java目录里面的代码对应的是eclispe项目中的src目录中的代码. 而studio中src目录里面包括整个项目的所有代码包括资源文件和xml. 2. ...
- java double保留小数点的零的问题,java保留小数点问题
1.用DecimalFormat格式化,DecimalFormat df=new DecimalFormat("0.00"); System.out.println(df.form ...
- 转:Android ViewPager多页面滑动切换以及动画效果
一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式, 白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了 ...
- sqlserver重命名字段名称
EXEC sp_rename 'S2BASE_PRODUCT.[PRODUCT_ID]','TABTYPE_ID','COLUMN';
- poj2891
这道题就是扩展的中国剩余定理(模数不互质) 首先我们回忆一下中国剩余定理对于给定n个方程组x≡ai(mod pi) 令m=∏pi wi=m/pi,然后求解关于hi,ri的方程wi*hi+pi*ri=1 ...
- xmlWriter 以UTF-8格式写xml问题
dom4j中的XMLWriter提供以下几种构造方法: XMLWriter() XMLWriter(OutputFormat format) XMLWriter(OutputStream out) X ...
- HDU 2176 (Nim博弈 先手取胜方案) 取(m堆)石子游戏
切切水题,放松心情:-D #include <cstdio> + ; int a[maxn]; int main() { //freopen("in.txt", &qu ...
- 51nod1364 最大字典序排列
不断的在cur的后面找最大的符合条件的数扔到cur的前面. 用线段树维护操作就可以了. #include<cstdio> #include<cstring> #include& ...