Home Backend Development PHP Tutorial PHP data compression, encryption and decryption (pack, unpack)_PHP tutorial

PHP data compression, encryption and decryption (pack, unpack)_PHP tutorial

Jul 14, 2016 am 10:09 AM
php for exchange reduce add compression storage data document Telecommunication Decrypt need

Data is often exchanged in network communications and file storage. In order to reduce network communication traffic, file storage size, and encrypted communication rules, it is often necessary to perform two-way encryption and decryption of data to ensure data security.

The main functions needed to implement this function in PHP are mainly the pack and unpack functions
pack
Compress data into bit strings.
Syntax: string pack(string format, mixed [args]...);
Return value: String
This function is used to compress and package the data into a string.
a - NUL- padded string [padded string] Pad the string blanks with NULL characters
A - SPACE- string padded [padded string]
h – hexadecimal string, low nibble first (low nibble first)
H - Hexadecimal string, high nibble first (high nibble first)
c – character with sign
C – Character without sign
s – signed short pattern [short] (usually 16 bits, in machine byte order)
S – unsigned short pattern (usually 16 bits, machine byte sorted)
n - unsigned short pattern [short] (usually 16 bits, big endian byte sorted)
v - unsigned short pattern [short] (usually 16 bits, little endian byte sorted)
i – ​​signed integer (determined by size and byte order)
I – unsigned integer (determined by size and byte order)
l – signed long pattern [long] (usually 32 bits, in machine byte order)
L – unsigned long pattern [long] (usually 32 bits, in machine byte order)
N – unsigned long pattern [long] (usually 32 bits, in big edian byte order)
V – unsigned long mode [long] (usually 32 bits, in little edian byte order)
f – floating point (determined by size and byte order)
d – double (determined by size and byte order)
x – null byte [NUL byte]
X- Back up one byte [Back up one byte]
unpack
Decompress the bit string data.
Syntax: string pack(string format, mixed [args]...);
Return value: array
This function is used to decompress the bit string data. This function has exactly the same functionality and usage as the Perl function of the same name.
Case 1, pack reduces file data storage size
[php]
//Storage integer 1234567890
file_put_contents("test.txt", 1234567890);
//Storage integer 1234567890
file_put_contents("test.txt", 1234567890); At this time, the file size of test.txt is 10byte. Note that the file size is 10 bytes at this time, and the actual space occupied is 1KB.
The integers stored above are actually stored in the file test.txt in the form of strings.
But if it is stored as an integer binary string, it will be reduced to 4 bytes.
[php]
print_r(unpack("i", file_get_contents("test.txt")));
print_r(unpack("i", file_get_contents("test.txt")));
Case 2, Data Encryption
Storing a piece of meaningful data in the form of a string, 7-110-abcdefg-117.
After the character "-" is divided, the first digit indicates the length of the string, the second digit indicates the storage location, the third digit indicates the actual stored string, and the fourth digit indicates the end position.
[php]
file_put_contents("test.txt", "7-110-abcdefg-117");
file_put_contents("test.txt", "7-110-abcdefg-117");
Disadvantages of the above method:
1. Data storage size
2. The data is stored in clear text. If it is any sensitive information, it may cause unsafe access.
3. The file storage size increases in an irregular manner.
Encryption:
[php]
file_put_contents("test.txt", pack("i2a7i1", 7, 110, "abcdefg", 117));
file_put_contents("test.txt", pack("i2a7i1", 7, 110, "abcdefg", 117));
Storage a piece of data, the encryption format is: integer 2-digit length string 10-digit length integer 1-digit length.
Advantages:
1. Data size optimization
2. When you don’t know the compression format such as "i2a7i1", even if you get the file, you cannot correctly read the binary file and convert it into plain text.
3. When data increases, the file storage size increases by the same amount. Each time it is incremented by 19byte.
Case 3, key-value file storage www.2cto.com
The generated files are stored in two: index file and data file
The format of data storage in the file is as follows:
Code implementation:
[php]
error_reporting(E_ALL);
class fileCacheException extends Exception{
}
//Key-Value type file storage
class fileCache{
private $_file_header_size = 14;
private $_file_index_name;
private $_file_data_name;
private $_file_index;//index file handle
private $_file_data;//data file handle
private $_node_struct;//index node structure
private $_inx_node_size = 36; //Index node size
public function __construct($file_index="filecache_index.dat", $file_data="filecache_data.dat"){
$this->_node_struct = array(
              'next'=>array(1, 'V'),  
              'prev'=>array(1, 'V'),  
'data_offset'=>array(1,'V'),//Starting position of data storage
'data_size'=>array(1,'V'),//data length
'ref_count'=>array(1,'V'),//Quote here, imitating PHP's reference count destruction mode
              'key'=>array(16,'H*'),//Storage KEY  
);
$this->_file_index_name = $file_index;
$this->_file_data_name = $file_data;
if(!file_exists($this->_file_index_name)){
$this->_create_index();
                                                                 
                                            $this->_file_index = fopen($this->_file_index_name, "rb+");  
                                         
if(!file_exists($this->_file_data_name)){
$this->_create_data();
                                                                      
                                                                                                                                                                                                                                     
                                         
}
//Create index file
private function _create_index(){
$this->_file_index = fopen($this->_file_index_name, "wb+");//Binary storage requires the use of b
if(!$this->_file_index)
throw new fileCacheException("Could't open index file:".$this->_file_index_name);
$this->_index_puts(0, '<'.'?php exit()?'.'>');//Locate the file flow to the starting position 0, and place a php tag to prevent downloading
$this->_index_puts($this->_file_header_size, pack("V1", 0));
}
//Create storage file
private function _create_data(){
$this->_file_data = fopen($this->_file_data_name, "wb+");//Binary storage requires the use of b
if(!$this->_file_index)
throw new fileCacheException("Could't open index file:".$this->_file_data_name);
$this->_data_puts(0, '<'.'?php exit()?'.'>');//Locate the file flow to the starting position 0, and place a php tag to prevent downloading
}
private function _index_puts($offset, $data, $length=false){
fseek($this->_file_index, $offset);
if($length)
fputs($this->_file_index, $data, $length);
else else
fputs($this->_file_index, $data);
}
private function _data_puts($offset, $data, $length=false){
fseek($this->_file_data, $offset);
if($length)
fputs($this->_file_data, $data, $length);
else else
fputs($this->_file_data, $data);
}
/**
* File lock
* @param $is_block Whether it is an exclusive or blocking lock
*/
private function _lock($file_res, $is_block=true){
flock($file_res, $is_block ? LOCK_EX : LOCK_EX|LOCK_NB);
}
private function _unlock($file_res){
flock($file_res, LOCK_UN);
}
public function add($key, $value){
$key = md5($key);
$value = serialize($value);
$this->_lock($this->_file_index, true);
$this->_lock($this->_file_data, true);
fseek($this->_file_index, $this->_file_header_size);
list(, $index_count) = unpack('V1', fread($this->_file_index, 4));
$data_size = filesize($this->_file_data_name);
fseek($this->_file_data, $data_size);
$value_size = strlen($value);
$this->_data_puts(filesize($this->_file_data_name), $value);
$node_data =
pack("V1V1V1V1V1H32", ($index_count==0) ? 0 : $index_count*$this->_inx_node_size, 0, filesize($this->_file_data_name), strlen($value), 0, $ key);
$index_count++;
          $this->_index_puts($this->_file_header_size, $index_count, 4);  
  
          $this->_index_puts($this->get_new_node_pos($index_count), $node_data);  
  
          $this->_unlock($this->_file_data);  
          $this->_unlock($this->_file_index);  
     }  
  
     public function get_new_node_pos($index_count){  
          return $this->_file_header_size + 4 + $this->_inx_node_size * ($index_count-1);  
     }  
  
     public function get_node($key){  
          $key = md5($key);  
          fseek($this->_file_index, $this->_file_header_size);  
          $index_count = fread($this->_file_index, 4);  
  
          if($index_count>0) {  
               for ($i=0; $i < $index_count ; $i++) {   
                    fseek($this->_file_index, $this->_file_header_size + 4 + $this->_inx_node_size * $i);  
                    $data = fread($this->_file_index, $this->_inx_node_size);  
                    $node = unpack("V1next/V1prev/V1data_offset/V1data_size/V1ref_count/H32key", $data);  
  
                    if($key == $node['key']){  
                         return $node;  
                    }  
               }  
          }else{  
               return null;  
          }  
     }  
  
     public function get_data($offset, $length){  
          fseek($this->_file_data, $offset);  
          return unserialize(fread($this->_file_data, $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']);  
 
error_reporting(E_ALL);
 
class fileCacheException extends Exception{
 
}
 
//Key-Value型文件存储
class fileCache{
     private $_file_header_size = 14;
     private $_file_index_name;
     private $_file_data_name;
     private $_file_index;//索引文件句柄
     private $_file_data;//数据文件句柄
     private $_node_struct;//索引结点结构体
     private $_inx_node_size = 36;//索引结点大小
 
     public function __construct($file_index="filecache_index.dat", $file_data="filecache_data.dat"){
          $this->_node_struct = array(
               'next'=>array(1, 'V'),
               'prev'=>array(1, 'V'),
              'data_offset'=>array(1,'V'),//数据存储起始位置
              'data_size'=>array(1,'V'),//数据长度
'ref_count' = & gt; array (1, 'v'), // Quote here, imitate the reference counting of PHP, the destruction mode
              'key'=>array(16,'H*'),//Storage KEY
);
$this->_file_index_name = $file_index;
$this->_file_data_name = $file_data;
if(!file_exists($this->_file_index_name)){
$this->_create_index();
     }else{
                                              $this->_file_index = fopen($this->_file_index_name, "rb+");
    }
if(!file_exists($this->_file_data_name)){
$this->_create_data();
     }else{
                                              $this->_file_data = fopen($this->_file_data_name, "rb+");//Binary storage needs to use b
    }
}
//Create index file
private function _create_index(){
$this->_file_index = fopen($this->_file_index_name, "wb+");//Binary storage needs to use b
if(!$this->_file_index)
throw new fileCacheException("Could't open index file:".$this->_file_index_name);
$this->_index_puts(0, '<'.'?php exit()?'.'>');//Locate the file flow to the starting position 0, and place a php tag to prevent downloading
$this->_index_puts($this->_file_header_size, pack("V1", 0));
}
//Create storage file
private function _create_data(){
$this->_file_data = fopen($this->_file_data_name, "wb+");//Binary storage needs to use b
if(!$this->_file_index)
throw new fileCacheException("Could't open index file:".$this->_file_data_name);
$this->_data_puts(0, '<'.'?php exit()?'.'>');//Locate the file flow to the starting position 0, and place a php tag to prevent downloading
}
private function _index_puts($offset, $data, $length=false){
fseek($this->_file_index, $offset);
if($length)
fputs($this->_file_index, $data, $length);
else
fputs($this->_file_index, $data);
}
private function _data_puts($offset, $data, $length=false){
fseek($this->_file_data, $offset);
if($length)
fputs($this->_file_data, $data, $length);
else
fputs($this->_file_data, $data);
}
/**
* File Lock
* @param $is_block Whether it is an exclusive or blocking lock
*/
private function _lock($file_res, $is_block=true){
flock($file_res, $is_block ? LOCK_EX : LOCK_EX|LOCK_NB);
}
private function _unlock($file_res){
flock($file_res, LOCK_UN);
}
     public function add($key, $value){
          $key = md5($key);
          $value = serialize($value);
          $this->_lock($this->_file_index, true);
          $this->_lock($this->_file_data, true);
 
          fseek($this->_file_index, $this->_file_header_size);
 
          list(, $index_count) = unpack('V1', fread($this->_file_index, 4));
 
          $data_size = filesize($this->_file_data_name);
 
          fseek($this->_file_data, $data_size);
 
          $value_size = strlen($value);
 
          $this->_data_puts(filesize($this->_file_data_name), $value);
 
          $node_data = 
          pack("V1V1V1V1V1H32", ($index_count==0) ? 0 : $index_count*$this->_inx_node_size, 0, filesize($this->_file_data_name), strlen($value), 0, $key);
 
          $index_count++;
 
          $this->_index_puts($this->_file_header_size, $index_count, 4);
 
          $this->_index_puts($this->get_new_node_pos($index_count), $node_data);
 
          $this->_unlock($this->_file_data);
          $this->_unlock($this->_file_index);
     }
 
     public function get_new_node_pos($index_count){
          return $this->_file_header_size + 4 + $this->_inx_node_size * ($index_count-1);
     }
 
     public function get_node($key){
          $key = md5($key);
          fseek($this->_file_index, $this->_file_header_size);
          $index_count = fread($this->_file_index, 4);
 
          if($index_count>0) {
               for ($i=0; $i < $index_count ; $i++) { 
                    fseek($this->_file_index, $this->_file_header_size + 4 + $this->_inx_node_size * $i);
                    $data = fread($this->_file_index, $this->_inx_node_size);
                    $node = unpack("V1next/V1prev/V1data_offset/V1data_size/V1ref_count/H32key", $data);
 
                    if($key == $node['key']){
                         return $node;
                    }
               }
          }else{
               return null;
          }
     }
 
     public function get_data($offset, $length){
          fseek($this->_file_data, $offset);
          return unserialize(fread($this->_file_data, $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通信加密
通信双方都定义好加密格式:
例如:
[php] 
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())  
);  
 
$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解码方式,得到正确的数据
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477666.htmlTechArticle网络通信、文件存储中经常需要交换数据,为了减少网络通信流量、文件存储大小以及加密通信规则,经常需要对数据进行双向加解密以保...
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

What is Cross-Site Request Forgery (CSRF) and how do you implement CSRF protection in PHP? What is Cross-Site Request Forgery (CSRF) and how do you implement CSRF protection in PHP? Apr 07, 2025 am 12:02 AM

In PHP, you can effectively prevent CSRF attacks by using unpredictable tokens. Specific methods include: 1. Generate and embed CSRF tokens in the form; 2. Verify the validity of the token when processing the request.

PHP: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

See all articles