ホームページ  >  記事  >  バックエンド開発  >  php Pack()関数の詳細な説明と例

php Pack()関数の詳細な説明と例

WBOY
WBOYオリジナル
2016-08-08 09:24:261450ブラウズ

pack と unpack は、通常のプログラムでは実際に見るのは簡単ではありませんが、昔に PHP を使用して Excel を生成したことがあれば、それがわかるでしょう。最近、C を操作しようとしたときに、彼の Excel のヘッダーがパックされているので、もう一度確認する必要がありました。実は私に包頭を要求したのはCさんでした。 。 。実際、純粋な文字列も良いです。なぜパンを手に入れなければならないのですか?本当に混乱しています...
マニュアルには梱包と開梱の説明がありますが、すべて英語です。 。 。

ソケット操作機能を持つ言語には、パッケージのアセンブリに特化した関数があり、php も例外ではありません。php でバイナリ操作を実行します。 最近、PHP を使用して、C++ 言語で開発されたゲーム サーバーに接続するためのソケット クライアントを作成しました。 サーバー側の開発者は、バイナリ形式を使用してプロトコルの形式を定義します。プロトコルの形式は次のとおりです: Baot ヘッダー (2 バイト) + 暗号化 (1 バイト) + コマンド コード (2 バイト) + フレーム コンテンツ 1. パケット ヘッダーの内容は、記録されたフレーム コンテンツの長さです。暗号化: 0 は暗号化なし、1 は暗号化なしを意味します。 3. コマンド コードはサーバー コマンドの識別記号です
最初は、PHP がバイナリ パッケージを組み立てる必要があることを知らなかったので、回り道をしました。そしてサーバー開発者に、C 言語を使用していくつかのメモリを開発するよう依頼しました。操作関数はプロトコルの規則に従ってバイナリ パッケージを返し、その後、これらのメソッドを PHP が使用できる拡張関数のセットにコンパイルしました。

本題に戻り、この記事ではpackメソッドとunpackメソッドの使い方を紹介します。 PHP の公式マニュアルには、特に書式設定パラメータの使用例が少なすぎて理解しやすくなっています。
抜粋のパラメータの中国語説明:
パック/アンパックテンプレート文字 文字の意味
a 空のスペースで満たされたバイト文字列A スペースで満たされたバイト文字列b 各バイトにビットを含むビット文字列 順序は昇順ですorder
B ビット文字列。各バイトのビットの順序は降順です。 c 符号付き char (8 ビット整数) 値 C Unicode については、U
d A を参照してください。ネイティブ形式の倍精度浮動小数点数 f ネイティブ形式の単精度浮動小数点数 h 下位 4 ビットが最初の 16 進数文字列
H 上位 4 桁が最初の 16 進数文字列
i 符号付き整数値、ネイティブ形式
I 符号なし整数値、ネイティブ形式
l 符号付き長整数、常に 32 ビット
L 符号なし長整数、常に 32 ビット
n 16 ビット短整数、「ネットワーク」バイトオーダー (ビッグエンディアン)
N A 32 -bit short integer、「ネットワーク」バイトオーダー (ビッグエンディアン)
p NULL で終わる文字列へのポインタ
P 固定長へのポインタ 文字列へのポインタ
q 符号付きクワッド (64 ビット整数) 値
Q An unsigned quad (64 ビット整数) 値
s 符号付き short 整数値、常に 16 ビット
S unsigned short integer 値、常に 16 ビット、
バイトオーダーはマシンチップに関連します

u エンコードされていない文字列
U A Unicode 文字番号
v 「VAX」バイトオーダーの 16 ビット短整数 (リトルエンドファースト)
V 「VAX」バイトオーダーの 32 ビット短整数 (リトルエンディアン)
w BER 圧縮された整数
x A null byte (1 バイト前方は無視されます)
X バイトをバックアップします
Z A NULL で終了する (および NULL で埋められる) バイト文字列
@ 絶対位置を NULL バイトで埋めます string Pack ( string $format [,mixed $args [,mixed $...]] ) いくつかのルール:
1. 各文字の後に数字を続けることができます。count が * の場合、それは他のすべてを意味します。
2. $format で必要なパラメーターよりも少ないパラメーターを指定すると、pack はすべての欠落値が null であると想定します。 $format で必要な数よりも多くのパラメータを指定した場合、追加のパラメータは無視されます。
以下の例を使用すると理解しやすくなります:



PHPコード

  1. パックについて:
  2. 以下の最初の部分は、数値をバイトにパックします:
  3. $out = Pack("CCCC", 、66、; , 66, 67, 68); # 同じこと 以下は Unicode の循環文字に対して同じことを行います:
  4. $foo = Pack("U4" , 0 x24b6, 0x24b7, 0x24b8 , 0x24b9);
  5. 以下は、空のスペースを追加して同様のことを行います: 65, 66, 67 , 68);
  6. $data = "010000020007";
  7. unpack("Sint1/Cchar1/Sint2/Cchar2",$data );
  8. ##
  9. array(
  10. 'int1'=>1, 'char1'=>'0','int2' => 2.'char2'=>7); $ lastact = Pack('SCSa32a32',0x0040, 0x00, 0x0006,
  11. $ユーザー名,
  12. $パスワード );
  13. unpack('Sint1/ Cchar1/Sint2/Cchar2/',$lastmessage); 上記のコンテンツは http://blog. sina.com.cn/s/blog_3eba8f1c0100nq9r.html 無事に使用できるようになりました。ヘイヘイ他にも参考資料があります:http://bbs.phpchina.com/thread-104492-1-1.htmlhttp://hi.baidu.com/chinetman/item/f78a71d847e7d638e2108fda 上記では、php Pack() 関数の詳細な説明と例を、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。