PHP pack, unpack, Ord function using method (binary stream Interface application example)
At work, I also learned that Pack,unpack,ord is powerful for binary byte processing. Let me introduce them to you. In our work, there is not much estimation of their use. I am in a recent job, because the communication needs to use the binary stream, and then the interface is received in PHP. At that time, a lot of information was consulted. Because they are really less used, they are seldom used by friends in their work. At work, I also learned that Pack,unpack,ord is powerful for binary byte processing. Let me introduce them to you.
Pacrk function Description: This function is used to compress data into a string in place.
Syntax: Pack (format,args+)
Parameter description
Format required. Specifies the format to use when wrapping the data.
Args+ is optional. Specifies one or more parameters that are packaged.
Character description
A fills the string blank with a NULL character
A fills the string blanks with space characters (spaces)
H 16 string, low in front
H 16 string, high in front
C with number characters
C No number character
S has a short integer (16 bits, depending on the computer's bit order)
S no-number short integer (16 bits, depending on the computer's bit order)
n unsigned short integers (16-bit, high-order in the back)
V Short Integer (16 bits, low in the back order)
I number integers (depending on the computer's order and range)
I no-number integers (depending on the computer's order and range)
L number Long Integer (32 bits, depending on the computer's bit order)
L unsigned long integers (32 bits, depending on the computer's bit order)
N unsigned short integers (32-bit, high-order in the back)
V short Integer (32 bits, low in the back order)
F Single precision floating point number (depending on the range of the computer)
D-times accurate floating point number (depending on the computer's range)
X vacancy
X Rewind One
@ Fill in NULL characters to absolute position
Unpack function Description: This function is used to extract the data of the bit string
Syntax: Unpack (format,args+)
Parameter description
Format required. Specifies the format to use when wrapping the data.
Args+ is optional. Specifies one or more parameters that are packaged.
The parameters are the same as the pack.
Ord function Description: Returns the Acill code value of the corresponding character
Syntax: Ord ($character);
Example Description:
A character $str = (Pack ("*", "China"), echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
';//h character $str = (Pack ("h*", "Fffe"), echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
';//c character $str = (Pack ("c*", "" "," "", "" ")" echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
';//i character short shaping 32 bits 4 bytes 64 bits 8 Bytes $str = (Pack ("I", "" "), echo $str," = ", strlen ($STR)," Byte \ n "; Getascill ($STR); echo '
';//s character short shaping 2 bytes $str = (Pack ("s", "X"), echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
';//l character length 4 bytes $str = (Pack ("L", "+"), echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
';//f character single-precision floating point 4 bytes $str = (Pack ("F", "+"), echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
';//d character double-precision floating point 8 bytes $str = (Pack ("D", "+"), echo $str, "=", strlen ($STR), "Byte \ n"; Getascill ($STR); Echo '
'; function Getascill ($str) {$arr = Str_split ($STR); foreach ($arr as $v) {echo $v, "=", Ord ($v), "\ n";} echo "=============\r\n\r\n";}
With the above example, we can see that the same string, stored in a different format, consumes a different number of bytes. It can also be seen here that saving characters in different formats can save space for storage. and start the unreadable encryption effect. Suddenly think of a bit, Design database field type problems, if a field is just: 10-bit length integer type. We set it to reshape: 256*256*256*256 is 4 bytes, if set to 10 length string. That accounts for 10 bytes. The whole digestive space is twice times the size. Setting the correct character type is a great help in improving database performance. Oh, a little off-topic ...
A case analysis of PHP processing byte code communication
Just said pack function: space-saving, encrypted format
Here are 2 examples to illustrate, interface development requirements:
Parameter description
User name 20 bytes, character type
Password 10 bytes, character type
Age 1 Bytes, no character char type
Date of birth 4 bytes, integer (19800101)
Mailbox 50 Bytes, string
Between fields: "\" split
A, pack Packaging
$code =array ("username" =>array ("A20", "Zhang San Adfb12"), "Pass" =>array ("A10", "asdf* #1"), "Age" =>array ("C", "23") , "Birthday" =>array ("I", "19900101"), "email" =>array ("A50", "zhangsan@163.com")); $stream =join ("n", Packbyarr ($code)); Echo $stream, strlen ($stream); File_put_contents ("C:/1.txt", $stream); Save the stream for easy reading of function Packbyarr ($arr) { $atArr =array (); foreach ($arr as $k = + $v) { $atArr []=pack ($v [0], $v [1]); } return $ATARR; } function Getascill ($str) { $arr =str_split ($STR); foreach ($arr as $v) { echo $v, "=", Ord ($v), "\ n";
The entire length is 89 bytes, because it is split with "\". With the above output, some string output can be read, the others have become garbled. This is what I said can be kept secret effect reason.
B, unpack unpacking
The unpacking needs to be read in a packaged manner, the length of the read, what type to read, and the same as the packing rules.
$code =array ("username" =>array ("A20"), "Pass" =>array ("A10"), "Age" =>array ("C"), "Birthday" =>array ("I") , "email" =>array ("A50")); $stream =file_get_contents ("C:/1.txt"); Var_dump (Packbyarr ($stream, $code)); function Packbyarr ($STR, $code) { $Arr =explode ("n", $str); $ATARR =array (); $i =0; foreach ($code as $k = + $v) { $atArr [$k]=unpack ($v [0], $ARR [$i]); $i + +; }
Citation: http://randomclan.blog.163.com/blog/static/1453009820125454418912/