PHP資料壓縮 加解密 pack, unpack

2021-07-23 15:07:18 字數 3956 閱讀 3749

網路通訊、檔案儲存中經常需要交換資料,為了減少網路通訊流量、檔案儲存大小以及加密通訊規則,經常需要對資料進行雙向加解密以保證資料的安全。

php中實現此功能主要需要使用的函式主要是pack及unpack函式

pack

壓縮資料到位字串之中。

語法: string pack(string format, mixed [args]...);

返回值: 字串

本函式用來將資料壓縮打包到位的字串之中。

a - nul- 字串填滿[padded string] 將字串空白以 null 字元填滿

a - space- 字串填滿[padded string]

h – 十六進製制字串,低「四位元」[low nibble first] (低位在前)

h - 十六進製制字串,高「四位元」[high nibble first](高位在前)

c – 帶有符號的字元

c – 不帶有符號的字元

s – 帶有符號的短模式[short](通常是16位,按機器位元組順序)

s – 不帶有符號的短模式[short](通常是16位,按機器位元組排序)

n -不帶有符號的短模式[short](通常是16位,按大endian位元組排序)

v -不帶有符號的短模式[short](通常是16位,按小endian位元組排序)

i – 帶有符號的整數(由大小和位元組順序決定)

i – 不帶有符號的整數(由大小和位元組順序決定)

l– 帶有符號的長模式[long](通常是32位,按機器位元組順序)

l – 不帶有符號的長模式[long](通常是32位,按機器位元組順序)

n – 不帶有符號的長模式[long](通常是32位,按大edian位元組順序)

v– 不帶有符號的長模式[long](通常是32位,按小edian位元組順序)

f –浮點(由大小和位元組順序決定)

d – 雙精度(由大小和位元組順序決定)

x – 空位元組[nul byte]

x- 後面乙個位元組[back up one byte](倒回一位)

unpack

解壓縮位字串資料。

語法: string pack(string format, mixed [args]...);

返回值: 陣列

本函式用來將位的字串的資料解壓縮。本函式和 perl 的同名函式功能用法完全相同。

案例一、pack實現縮減檔案資料儲存大小

<?php 

//儲存整數1234567890

file_put_contents("test.txt", 1234567890);

此時test.txt的檔案大小是10byte。

注意此時檔案大小是10位元組,實際占用空間大小是1kb 。

上面儲存的整數實際是以字串形式儲存於檔案test.txt中。

但如果以整數的二進位制字串存jy儲,將會縮減至4byte。

<?php 

print_r(unpack("i", file_get_contents("test.txt")));

案例

二、資料加密

以字串形式儲存一段有意義資料,7-110-abcdefg-117。

字元"-"分割後,第一位表示字串長度,第二位表示儲存位置,第三位表示實際儲存的字串,第四位表示結尾位置。

<?php 

file_put_contents("test.txt", "7-110-abcdefg-117");

上述方法缺點:

一、資料儲存大小

二、資料以明文方式儲存,如果是任何敏感資訊,都可能造成不安全訪問。

三、檔案儲存大小,以不規則方式遞增。

加密:

<?php 

file_put_contents("test.txt", pack("i2a7i1", 7, 110, "abcdefg", 117));

儲存一段資料,加密格式為:整數2位長度字串10位長度整數1位長度。

優點:一、資料大小最優化

二、在不知道"i2a7i1"這樣的壓縮格式時,即使拿到檔案,也無法正確讀出二進位制檔案轉化為明文。

三、資料增加時,檔案儲存大小是等量遞增。每次都是以19byte遞增。

案例三、key-value型檔案儲存

儲存生成的檔案為兩個:索引檔案,資料檔案

檔案中資料儲存的格式如下圖:

**實現:

<?php 

error_reporting(e_all);

class filecacheexception extends exception

//key-value型檔案儲存

class filecacheelse

if(!file_exists($this->_file_data_name))else

}//建立索引檔案

private function _create_index()

//建立儲存檔案

private function _create_data()

private function _index_puts($offset, $data, $length=false)

private function _data_puts($offset, $data, $length=false)

/*** 檔案鎖

* @param $is_block 是否獨佔、阻塞鎖

*/private function _lock($file_res, $is_block=true)

private function _unlock($file_res)

public function add($key, $value)

public function get_new_node_pos($index_count)

public function get_node($key)

}}else

}public function get_data($offset, $length)

}//使用方法

$cache = new filecache();

$cache->add('abcdefg' , 'testabc');

$data = $cache->get_node('abcdefg');

print_r($data);

echo $cache->get_data($data['data_offset'], $data['data_size']);

案例四、socket通訊加密

通訊雙方都定義好加密格式:

例如:

$login = array(

'command'=>array('a30', 'login'),

'data'=>array('a30', 'hello')

);$logout = array(

'command'=>array('a30', 'logout'),

'data'=>array('a30', 'good bye')

);$login_success = array(

'command'=>array('a30', 'login_success'),

'data'=>array('v1', 1)

);$logout_success = array(

'command'=>array('a30', 'login_success'),

'data'=>array('v1', time())

);

伺服器端與客戶端根據解析command格式,找到對應的data解碼方式,得到正確的資料

ASIHTTPRequest 資料壓縮

從0.9版本開始,asihttprequest會提示伺服器它可以接收gzip壓縮過的資料。apache 2.x以上版本已經配備了mod deflate擴充套件,這使得apache可以透明地壓縮特定種類的資料。要開啟這個特性,你需要在apache的配置檔案中啟用mod deflate。並將mod de...

ASIHTTPRequest 資料壓縮

從0.9版本開始,asihttprequest會提示伺服器它可以接收gzip壓縮過的資料。apache 2.x以上版本已經配備了mod deflate擴充套件,這使得apache可以透明地壓縮特定種類的資料。要開啟這個特性,你需要在apache的配置檔案中啟用mod deflate。並將mod de...

ASIHTTPRequest 資料壓縮

從0.9版本開始,asihttprequest會提示伺服器它可以接收gzip壓縮過的資料。apache 2.x以上版本已經配備了mod deflate擴充套件,這使得apache可以透明地壓縮特定種類的資料。要開啟這個特性,你需要在apache的配置檔案中啟用mod deflate。並將mod de...