開扒php內核函數,第一篇 bin2hex

這段時間真的比較有時間,因此本身用c寫一下bin2hex啦php

寫個php的人都知道,這是個比較熟悉的函數吧,沒有什麼高深,只是把輸入的東西以16進制輸出吧了函數

先分析一下,這個函數要怎麼寫吧,他會有必定的邏輯,那麼他就有循環體和終結條件啦優化

咱們先看看怎樣把一個數轉爲16進制吧3d

960 / 16 = 60 餘數爲 0blog

60 / 16 = 3 餘數爲 12內存

3 /16 = 0.XX 餘數爲 3ci

那麼 960 的16進制 是 3c0get

image

從上面咱們能夠看出當 商>=1的時候就不用再繼續啦,而後 把上面的每個步驟倒轉疊加就能夠啦it

因而我寫出了一下代碼變量

image

爲何用malloc,由於我實在找不到一個函數能夠 用來單個字符鏈接,strcat又報錯,因此只好用malloc

其實一開始 while(0) 這裏我是寫 while(q>=1)的,可是咱們有一個先知條件,就是ascii碼是一個字節的,0到255

如下是我查的資料

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

那麼咱們就能夠 寫出 29,30行的代碼啦,爲何呢,由於已知ascii碼不大於266,因此咱們能夠肯定第一次的商就是第二次的模 ,因此有while(0)

運行下結果呢

image

 

答案是正確的,由於本身資質實在太差,因此想了半天才寫了這個代碼,其中找那個字符鏈接函數找了好久啦,

下面咱們來看看php是怎麼實現的

image

image

瞬間高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關鍵字只是讓當前變量只能在當前代碼頁可用

以後的代碼咱們佔時能夠不用理,咱們主要分析函數的主要部分,本身真的要多動手寫,小看代碼啊

相關文章
相關標籤/搜索