ホームページ >バックエンド開発 >PHPチュートリアル >unpack は unsigned Long Long 型をどのように受信しますか
サーバーはリトル エンディアン モードです。送信される最初の 8 バイトは符号なしの Long Long データです。どうすれば unpack を使用して読み出すことができますか?
unpack("Q8md5/a10end_str", $recv_body); これは機能しません。ありがとうございます
ああ、どうやって書いたらいいでしょうか? ありがとうございます
コードの説明
A SPACE-パディング文字列
h 16 進文字列、下位ニブルが最初 H 16 進文字列、上位ニブルが最初
c 符号付き文字
C 符号なし文字
s 符号付き short (常に 16 ビット、マシン バイト オーダー)
S unsigned short (常に 16 ビット、マシン バイト)順序)
n unsigned short (常に 16 ビット、ビッグエンディアンのバイトオーダー) signed
v unsigned short (常に 16 ビット、リトルエンディアンのバイトオーダー)
i signed integer (マシンに依存するサイズとバイトオーダー)
I unsigned integer (マシンに依存)サイズとバイトオーダー)
l signed long (常に 32 ビット、マシン バイト オーダー)
L unsigned long (常に 32 ビット、マシン バイト オーダー)
N unsigned long (常に 32 ビット、ビッグ エンディアン バイト オーダー)
V unsigned long (常に 32 ビット、リトルエンディアンのバイトオーダー)
f float (マシンに依存するサイズと表現)
d double (マシンに依存するサイズと表現)
x NUL バイト
何をしたいのか推測してください
unpack("Q8md5/a10end_str", $ recv_body)
は
unpack("Qmd5/a10end_str", $recv_body) として記述する必要があります
32 ビット PHP は 64 ビット整数をサポートしていませんが、ルールは依然として必要です
Q8 は 8 つの 64 ビット整数を表します。これは明らかに質問の意味と一致しません
md5という名前なので整数として扱うことはできません
$a ['md5']欲しい結果は出ませんか?
いいえ、amd5 は最初のバイトだけをデコードします...
この md5 は実際には unsigned long long 値の型を解決する方法です。 ?
base64_encode($recv_body) の結果を投稿した方がよいでしょう
サンプル データについてのみ説明できます
?????? ALLDATAEND
最初の 8 バイトは 8 桁で、その後にテキスト ALLDATAEND が続きます。 ("Nn1/a10end_str", $recv_body);
この解決策を使用すると、n1 は負の数 -1935870548 になります
正しい値は 441051427183631500 である必要があります
echo base64 _encode($ RECV_BODY); の結果
の用途=> 441051427183631500
[end_str] => ALLDATAEND
とても複雑ですね。長い数値
PHP は 32 ビットのコンパイラでコンパイルされるため、64 ビットの整数を処理する方法はありません
64 ビットのコンパイラでコンパイルすると、64 ビットの整数をサポートできます
もちろん、Q とqモードも使えて簡単です
はい、ありがとうございます