这段时间真的比较有时间,所以自己用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为打印字符;127Delete(删除)命令

那么我们就可以 写出 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的更多相关文章

  1. 开扒php内核函数,第二篇 hex2bin

    从上一篇我们得知怎样把ascii变成16进制显示,这篇我们是怎样把16进制变成ascii显示 我们还是从分析开始吧 先看这个函数的介绍吧 string hex2bin ( string $data ) ...

  2. 开扒php内核函数,第三篇 implode

    一开始觉得implode挺容易实现,但是写着写着才发现是挺复杂的,不说啦 来看看implode的用法吧 <?php $arr = array('Hello','World!','Beautifu ...

  3. lua学习之深入函数第一篇

    深入函数第一篇 函数是第一类值,具有特定的词法域 第一类值 第一类值的意思是函数与 lua 中的其他类型如数字,字符串具有相同的权力 函数可以存储到全局变量或局部变量变量,还可以存储到 table 中 ...

  4. python之函数第一篇

    一.为什么用函数: 解决代码重用问题 统一维护 程序的组织结构清晰,可读性强二.定义函数 先定义后使用!! def funcname(arg1,arg2,...): """ ...

  5. 华为LiteOS系统使用-任务调度函数-第一篇

    1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...

  6. 开博客这么久以来,第一篇技术文章,python与c的接口对接

    在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧.内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助.闲话少叙,开始正文. ...

  7. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  8. 深入理解javascript函数系列第一篇——函数概述

    × 目录 [1]定义 [2]返回值 [3]调用 前面的话 函数对任何一门语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即 ...

  9. 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?

    第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...

随机推荐

  1. struts2与struts1整合,java.lang.InstantiationException, Exception occurred during processing request: null

    做了2个action,其中一个运行没有问题,另一个报错,看下面的报错信息,再看了看struts.xml,因为没有给GetBooks这个action配置actionform,所以就导致报null.下面是 ...

  2. 路径名称和struts.xml配置不一致导致struts2报404

    struts.xml中写的是<result name="...">authorityInterceptor/xxx.jsp</result> 但是实际的文件 ...

  3. Git设置及GitHub的使用

    把github上的help略略翻译一遍.备忘. First : 安装:ubuntu 下,终端输入命令: sudo apt-get install git-core git-gui git-doc Ne ...

  4. js中indexOF和lastIndexOf

    indexOFindexOf() 方法返回某个指定的字符串值在字符串中首次出现的位置(从左向右).没有匹配的则返回-1,否则返回首次出现位置的字符串的下标值. var src="images ...

  5. Kafka安装与实验

    接上面一篇文章: http://www.cnblogs.com/charlesblc/p/6038112.html 主要参考这篇文章: http://www.open-open.com/lib/vie ...

  6. 5个缺失的 JavaScript 数字格式化函数

    /** 下面两个函数都能对浮点数进行四舍五入,保留小数点后两位 **/ function CurrencyFormatted(amount) { var i = parseFloat(amount); ...

  7. Linux多线程(三)(同步互斥)

    1. 线程的同步与互斥 1.1. 线程的互斥 在Posix Thread中定义了一套专门用于线程互斥的mutex函数.mutex是一种简单的加锁的方法来控制对共享资源的存取,这个互斥锁只有两种状态(上 ...

  8. mysql JDBC URL格式各个参数详解

    mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值 ...

  9. UIView的user Interaction Enabled属性

    A Boolean value that determines whether user events are ignored and removed from the event queue. 译: ...

  10. Service完全解析(转)

    今天我们来讲一下Android中Service的相关内容. Service在Android中和Activity是属于同一级别上的组件,我们可以将他们认为是两个好哥们,Activity仪表不凡,迷倒万千 ...