PHPにおけるpack、unpackの詳細な使い方

5554 ワード

PHPには2つの関数packとunpackがあり、多くのPHPerは実際のプロジェクトで使用したことがなく、この2つの方法が何に使われているのかさえ分からない.この文章では、二人が何に使っているのかを紹介します.
pack
string pack ( string $format [, mixed $args [, mixed $... ]] )

この関数は、対応するパラメータ($args)をバイナリ文字列にパッケージ化するために使用されます.
最初のパラメータ$formatには、次のオプションがあります(オプションのパラメータが多く、後で一般的な説明をいくつか選択します).
Code
Description
a
文字列の空白をNULバイトで埋めます
A
文字列をSPACE(スペース)で埋めます
h
16進数文字列、下位ビット
H
16進数文字列、上位
c
シンボル文字
C
符号なし文字
s
符号付き短縮型(16ビット、ホストバイト順)
S
符号なし短縮(16ビット、ホストバイト順)
n
符号なしショート整数(16ビット、エンドバイトシーケンス)
v
符号なし短縮型(16ビット、小バイト順)
i
符号付き整数(マシン関連サイズバイト順)
I
符号なし整数(マシン関連サイズバイト順)
l
符号付きロング整数(32ビット、ホストバイト順)
L
符号なしロング整数(32ビット、ホストバイト順)
N
符号なしロング整数(32ビット、エンドバイトシーケンス)
V
符号なしロング整数(32ビット、小バイトシーケンス)
q
符号付きロング整数(64ビット、ホストバイト順)
Q
符号なしロング整数(64ビット、ホストバイト順)
J
符号なしロング整数(64ビット、エンドバイトシーケンス)
P
符号なしロング整数(64ビット、小バイト順)
f
単精度浮動小数点型(マシン関連サイズ)
d
デュアル精度浮動小数点型(マシン関連サイズ)
x
NULバイト
X
1バイトのロールバック
Z
文字列の空白をNULバイトで埋める(new in PHP 5.5)
@
NULを絶対位置に入力
こんなに多くのパラメータを見て、私は初めて心がぼんやりしていて、ほとんどの説明はよく理解していますが、その中のホスト、大端、小端などのバイト順は何ですか?次の内容は退屈ですが、理解しなければなりません.堅持しましょう.
バイト順は何ですか?
バイトの順序であり、はっきり言ってマルチバイトデータの格納順序である(1バイトは明らかに順序を必要としない).例えば、AおよびBのそれぞれに対応するバイナリは、0100 00010100 0010と表される.格納文字列ABについては、いわゆるバイトシーケンスである0100 0001 0100 0010または0100 0010 0100 0001であってもよい.
ハイローバイト
例えば文字列AB,左高右低(我々の通常の読書順序),Aは高バイト,Bは低バイト
高/低アドレス
0 x 123456は、上位から下位への順序で格納され、メモリにはこのように格納されていると仮定します.
ハイアドレス->ローアドレス12->34->56
エンドバイト順(ネットワークバイト順)
大端とは、上位バイトをメモリの低アドレス端に、下位バイトを高アドレス端に置くことです.ネットワーク転送では(例えばTCP/IP)低アドレス端子(上位バイト)がストリームの開始に置かれ、2バイトの文字列(AB)についてはA(0-7 bit)、B(8-15 bit)の順で転送される.では、小端バイト順は自然に大端とは逆です.
ホストバイト順
その年のマシンのバイト順(すなわち、ネットワークのバイト順は決定され、ホストのバイト順はマシンによって決定される)を表し、 は小端バイト順である.
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       )

ASCII表1枚付き(linux/unixではman asciiを使用して表示できます)
hとH
$string = pack('H3', 281);
var_dump($string); //    : string(2) "("

for($i=0;$i

hとHは、対応するパラメータを16進数文字としてパッケージングしていることを特に説明する必要があります.どういう意味ですか.例えば上の281は、パッケージ化前に2810x281に変換します.16進数の1位はバイナリの4位に対応しているので、上の0x281は1.5バイトしかありません.後にデフォルトで0が0x2810になり、0 x 28に対応する10進数は40(()、0 x 10に対応する10進数は16(dle非表示文字)になります.分かりましたか?分からないならメッセージをください.
cとC
$string = pack('c3', 67, 68, -1);
var_dump($string); //  :string(3) "CD�"

for($i=0;$i

最後に出力本能は、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

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であるのか、これは浮動小数点数の格納と関係があり、後にIEEE規格を1つの文章で説明することができる.
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
$string = pack('@4'); //      N nul
var_dump($string); //  : string(4) ""

for($i=0;$i

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ビット数字>)
  • 自分で考えろ
  • 数独ウィジェット「唯一数独」を開発しました.スキャンを歓迎します.