pack unpack自製二進位制「資料庫」

2022-03-09 12:22:25 字數 2999 閱讀 5247

pack、unpack函式,如果沒有接觸過socket,這個可能會比較陌生,這兩個函式在socket互動的作用是組包,將資料裝進乙個二進位制字串,和對二進位制字串中的資料進行解包,這個裡面有好多種格式,具體的格式可以去查查官方的手冊(或者等看完本篇文章之後,去呼叫介面檢視),我這裡主要用了pack(「n」,int),pack(「a」,str)以及他們兩個對應的解包函式,n在手冊中的解釋是下面這個,佔4個位元組,大端方式(其實就是低位在前還是在後的問題)。a是對字串進行打包,不夠指定的數值的時候用null(\0,或者說assic碼0對應的字元)填充。

n - unsigned long (always 32 bit, big endian byte order)

a - nul-padded string

我將用這個打包解包函式做乙個函式手冊查詢小工具,或者可以說是乙個自製小型二進位制資料庫。

在做這個二進位制檔案資料庫的時候我會建立兩個檔案,乙個是索引檔案,乙個是要查詢的資料的檔案,分別看看他們的結構:

說明中括號內的數字為所佔位元組(bytes)數,"~"波浪線表示所佔位元組數不確定

資料檔案,第乙個php是乙個正式的字串"php",佔4個位元組,後面跟著版本說明,長度不確定(這個長度可以從後面的index檔案中獲取),接下來後面是儲存資訊的主體了。首先是乙個函式名長度lenname佔4個位元組,接下來是函式名稱,長度不確定,有前面的lenname對應的值確定,接下來是lenval佔4個位元組,後面跟的是具體的函式說明內容,長度有前面的lenval對應的值確定。

內容儲存格式定義

++++++++++++++++++++++++++++++++++++++

|php(4) |版本說明(~) |

++++++++++++++++++++++++++++++++++++++

|lenname(4) |函式名稱(~) |

++++++++++++++++++++++++++++++++++++++

|lenval(4) |函式內容(~) |

++++++++++++++++++++++++++++++++++++++......

索引檔案,索引檔案就比較簡單了,其中全部儲存了上面的儲存檔案中每個函式開始的指標位置,每個位置占用4個位元組。

索引格式定義

++++++++++++++++++++++++++++++++++++++

|position(4) |

++++++++++++++++++++++++++++++++++++++......

由於儲存檔案中的內容是按照函式名順序排序儲存的,索引也是按照函式儲存的順序儲存的,所以獲取起來很方便,直接使用二分法就可以很輕鬆的獲取到想要的函式

在查詢的時候主要使用了下面幾個方法:

第一、從制定位置獲取一條索引的值(也就是對應的函式儲存檔案的指標位置)

/*

* * 從索引檔案中獲取一條記錄的位置

* @param 索引檔案中的開始位置,從開始位置獲取四個位元組為乙個函式說明的開始位置

* @return 返回該索引位置所對應的儲存位置指標偏移量 */

private

function _getoneindex($pos

)

二、從指定的指標偏移位置獲取一條len(4)+val(~)格式的內容

/*

* * 從制定的指標偏移量獲取乙個len+val型的內容

* @param $pos 檔案的指標偏移量

* @return 返回陣列,包括長度和值 */

private

function _getstorelenvalformat($pos

)

三、獲取制定函式的說明,這個也是最主要的一部分,使用二分法從資料檔案中獲取一條記錄

/*

* * 獲取函式內容

* @param 要查詢的函式名稱

* @return 返回函式說明的json字串 */

public

function get($func

)elseif($flag

< 0)

else

}return

$ret

;}

使用很簡單,只需包含類庫檔案和儲存檔案資料庫,然後呼叫幾句**就可以

<?php

include_once("./manual/phpmanual.php");

$t = new

phpmanual();

$t->init('zh');

echo

$t->get("unpack");

輸出的是json字串,轉化後如下所示,其中有詳細的說明,以及簡潔的例子

,

],"ret_type": "array"}

],"examples": [,,

]}

最後再附上目錄結構:

+phpmanual

+manual

+phpmanual

+zh|_manualindex

|_manualstore

|_phpmanual.php

|_test.php

完整例子位址

從這裡拿到的phpmanual的全部資料

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...

mysql二進位制 MySql二進位制連線方式詳解

使用mysql二進位制方式連線 您可以使用mysql二進位制方式進入到mysql命令提示符下來連線mysql資料庫。例項以下是從命令列中連線mysql伺服器的簡單例項 root host mysql u root p enter password 在登入成功後會出現 mysql 命令提示視窗,你可以...