PHP中的pack和unpack函数的用法详解
PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两个方法是用来干嘛的。这篇文章来为大家介绍一下它俩到底是用来干啥的。
pack
string pack ( string $format [, mixed $args [, mixed $... ]] )
该函数用来将对应的参数($args)打包成二进制字符串。
其中第一个参数$format,有如下选项(可选参数很多,后面会选几个常用的讲解):
这么多参数看下来,我第一次是真心懵逼了,大部分说明都很好理解,但是其中的主机、大端、小端等字节序是什么鬼呢?接下里的内容比较枯燥,但必须理解才行,坚持吧。
字节序是什么?
就是字节的顺序,说白了就是多字节数据的存放顺序(一个字节显然不需要顺序)。
比如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)。
那么小端字节序自然和大端相反。
主机字节序
表示当年机器的字节序(也就是网络字节序是确定的,而主机字节序是依机器确定的),一般为小端字节序。
a和A(打包字符串,用NUL或者空格填充)
$string = pack('a6', 'china’); var_dump($string); //输出结果: string(6) "china",最后一个字节是不可见的NUL echo 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对应的就是空格)
[图片上传失败...(image-5d8a61-1577941896554)]
附赠ASCII表一张(linux/unix下可以使用man ascii查看)
h和H
$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和H需要特殊说明一下,它们是将对应的参数看做十六进制字符然后打包。什么意思呢?比如上面的281,打包前会将281转换为0x281,因为十六进制的一位对应二进制的四位,上面的0x281只有1.5个字节,后面会默认补0变成0x2810,0x28对应的十进制为40((),0x10对应的十进制为16(dle不可见字符)。
c和C
$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
最后输出本能应该觉得是67 68 -1
ord获取的是字符的ASCII码(范围0-255),这时-1(0000 0001)对应的字符将以补码的形式输出也就是255(1111 1110 + 0000 0001 = 1111 1111)
整型相关
所有的整型类型使用方法完全一样,主要注意它们的位和字节序就可以了,下面以L作为例子展示:
$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
f和d
$string = pack('f', 12345.123); var_dump($string); //输出:string(4) "~�@F” var_dump(unpack('f', $string)); //这里提前用到了unpack,后面会讲解 //输出:float(12345.123046875)
f和d是针对浮点数打包,至于为什么打包前是12345.123解包后是12345.123046875,这个和浮点数的储存有关系。
x、X、Z、@
$string = pack('x'); //打包一个nul字符串 echo ord($string); //输出: 0
关于X(大写X),试了N次,没搞明白怎么用,有清楚的童鞋可以给我留言,多谢。
$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个nul var_dump($string); //输出: string(4) “” for($i=0;$i<strlen($string);$i++) { echo ord($string[$i]) . PHP_EOL; } //输出: 0 0 0 0
unpack
array unpack ( string $format , string $data )
unpack的使用相当简单,就是讲pack打包的数据解包,打包的时候用的什么参数,就用什么参数解包,具体使用懒得说了,列几个小例子:
$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) }
这两个函数到底有啥用途
·数据通信(通过二进制格式与其它语言通信)
·数据加密(如果不告诉第三方你的打包方式,对方解包的难度就相对很大)
·节省空间(比如比较大的数字按字符串储存会浪费很多空间,打包成二进制格式才需要4位<32位数字>)
PHP中文网有大量免费的PHP入门教程,欢迎大家学习!
本文转自:https://www.jianshu.com/p/942907071a4c
Atas ialah kandungan terperinci PHP中的pack和unpack函数的用法详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
