Il existe deux fonctions pack et unpack en PHP. De nombreux PHPers ne les ont jamais utilisées dans de vrais projets, et ils ne savent même pas à quoi servent ces deux méthodes. Cet article explique principalement comment utiliser pack et unpack en PHP. J'espère qu'il pourra vous aider.
string pack ( string $format [, mixed $args [, mixed $... ]] )
Cette fonction est utilisée pour regrouper les paramètres correspondants ($args) dans une chaîne binaire.
Le premier paramètre $format a les options suivantes (il existe de nombreux paramètres facultatifs, et nous en choisirons quelques-uns couramment utilisés plus tard) :
a Remplissez les espaces de chaîne avec des octets NUL
A Avec Chaîne de remplissage ESPACE (espace)
h Chaîne hexadécimale, bas de gamme en premier
H Chaîne hexadécimale, haut de gamme en premier
c Caractère signé
C Caractère non signé
s Signé court (16 bits, ordre des octets de l'hôte)
S Court non signé (16 bits, ordre des octets de l'hôte)
n Court non signé (16 bits, big endian) Endianness)
v Court non signé (16 bits, little-endian)
i Entier signé (gros et petit endian dépendant de la machine)
I Entier non signé (dépendant de la machine) Ordre des gros et petits octets)
l Long signé (32 bits, ordre des octets de l'hôte)
L Long non signé (32 bits, ordre des octets de l'hôte)
N Long non signé (32 bits, big endian)
V Entier long non signé (32 bits, little endian)
q Entier long signé (64 bits, ordre des octets de l'hôte)
Q Entier long non signé (64 bits, ordre des octets de l'hôte)
J Entier long non signé (64 bits, gros endian)
P Entier long non signé (64 bits, petit endian)
f Flottant simple précision point (taille dépendante de la machine)
d Virgule flottante double précision (taille dépendante de la machine)
x octet NUL
X Section de secours d'un mot
Z Remplit les espaces de chaîne avec des octets NUL (nouveau dans PHP 5.5)
@ Remplit NUL à la position absolue
En regardant tant de paramètres, j'étais vraiment confus pour la première fois Wow, la plupart des instructions sont faciles à comprendre, mais quel est l'endianisme de l'hôte, le big endian, le little endian, etc. ? Le contenu suivant est relativement ennuyeux, mais il doit être compris, alors respectez-le.
就是字节的顺序,说白了就是多字节数据的存放顺序(一个字节显然不需要顺序)。 比如A和B分别对应的二进制表示为0100 0001、0100 0010。对于储存字符串AB,我们可以0100 0001 0100 0010也可以0100 0010 0100 0001,这个顺序就是所谓的字节序。
比如字符串AB,左高右低(我们正常的阅读顺序),A为高字节,B为低字节
假设0x123456是按从高位到底位的顺序储存,内存中是这样存放的: 高地址 -> 低地址12 -> 34 -> 56
大端就是将高位字节放到内存的低地址端,低位字节放到高地址端。网络传输中(比如TCP/IP)低地址端(高位字节)放在流的开始,对于2个字节的字符串(AB),传输顺序为:A(0-7bit)、B(8-15bit)。 那么小端字节序自然和大端相反。
表示当年机器的字节序(也就是网络字节序是确定的,而主机字节序是依机器确定的),一般为小端字节序。
$string = pack('a6', 'china'); var_dump($string); //输出结果: string(6) "china",最后一个字节是不可见的NULecho ord($string[5]); //输出结果: 0(ASCII码中0对应的就是nul)//A同理$string = pack('A6', 'china'); var_dump($string); //输出结果: string(6) "china ",最后一个字节是空格echo ord($string[5]); //输出结果: 32(ASCII码中32对应的就是空格)
Livré avec une table ASCII (vous pouvez utiliser man ascii pour la visualiser sous linux/unix)
$string = pack('H3', 281); var_dump($string); //输出结果: string(2) "("for($i=0;$i<strlen($string);$i++) {echo ord($string[$i]) . PHP_EOL; }//输出结果: 40 16
H et H ont besoin explication spéciale. Ils traitent les paramètres correspondants comme des caractères hexadécimaux et les regroupent ensuite. Qu'est-ce que ça veut dire? Par exemple, le 281 ci-dessus sera converti en 0x281 avant l'empaquetage, car un chiffre hexadécimal correspond à quatre chiffres binaires. Le 0x281 ci-dessus ne fait que 1,5 octets et sera complété par 0 par défaut pour devenir 0x2810, la décimale correspondant à 0x28. vaut 40((), la décimale correspondant à 0x10 est 16 (dle caractère invisible), tu comprends ? Si tu ne comprends pas, tu peux me laisser un message.
$string = pack('c3', 67, 68, -1); var_dump($string); //输出:string(3) "CD�"for($i=0;$i<strlen($string);$i++) { echo ord($string[$i]) . PHP_EOL; } //输出: 67 68 225
Le résultat final devrait être 67 68 -1
ord obtient le code ASCII du caractère (plage 0-255). A ce moment, le caractère correspondant à -1 (0000 0001) sera affiché sous forme de complément, soit 255 (1111 1110 + 0000 0001 = 1111 1111). )
Tous les types d'entiers sont utilisés exactement de la même manière, faites simplement attention à leur ordre en bits et en octets. Ce qui suit utilise L comme exemple
$string = pack('L', 123456789); var_dump($string); //输出:string(4) "�["for($i=0;$i<strlen($string);$i++) { echo ord($string[$i]) . PHP_EOL; } //输出: 21 205 91 7
$string = pack('f', 12345.123); var_dump($string);//输出:string(4) "~�@F"var_dump(unpack('f', $string)); //这里提前用到了unpack,后面会讲解 //输出:float(12345.123046875)
f et d sont emballés pour les nombres à virgule flottante. Quant à savoir pourquoi il s'agit de 12345.123 avant l'emballage et de 12345.123046875 après le déballage, cela a quelque chose à voir avec le stockage des flottants. numéros de points
$string = pack('x'); //打包一个nul字符串echo ord($string); //输出: 0
$string = pack('Z2', 'abc5'); //其实就是将从Z后面的数字位置开始,全部设置为nul var_dump($string); //输出:string(2) "a"for($i=0;$i<strlen($string);$i++) { echo ord($string[$i]) . PHP_EOL; } //输出: 97 0
$string = pack('@4'); //我理解为填充N个nulvar_dump($string); //输出: string(4) ""for($i=0;$i<strlen($string);$i++) {echo ord($string[$i]) . PHP_EOL; }//输出: 0 0 0 0
array unpack ( string $format , string $data )
Quelles sont les utilités de ces deux fonctions ?
$string = pack('L4', 1, 2, 3, 4); var_dump(unpack('L4', $string));//输出:array(4) { [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) }$string = pack('L4', 1, 2, 3, 4); var_dump(unpack('Ll1/Ll2/Ll3/Ll4', $string)); //可以指定key,用/分割//输出:array(4) { ["l1"]=> int(1) ["l2"]=> int(2) ["l3"]=> int(3) ["l4"]=> int(4) }
Économisez de l'espace (par exemple, stocker des nombres relativement grands sous forme de chaînes gaspillera beaucoup d'espace, et seuls 4 chiffres sont nécessaires pour les regrouper au format binaire )
Recommandations associées :
Explication détaillée de l'utilisation de pack et unpack
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!