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