ホームページ >バックエンド開発 >PHPチュートリアル >unpack は unsigned Long Long 型をどのように受信しますか

unpack は unsigned Long Long 型をどのように受信しますか

WBOY
WBOYオリジナル
2016-06-23 14:09:141443ブラウズ

サーバーはリトル エンディアン モードです。送信される最初の 8 バイトは符号なしの Long Long データです。どうすれば unpack を使用して読み出すことができますか?
unpack("Q8md5/a10end_str", $recv_body); これは機能しません。ありがとうございます


ディスカッションへの返信 (解決策)

2 つの 32 ビット アンパックを分解します。いずれにせよ、これらは浮動小数点ではなく整数です。

直接返す場合は、システムがオーバーフローするかどうかによって異なります。さらに、上で書いたものは unpack 構文に準拠していません


ああ、どうやって書いたらいいでしょうか? ありがとうございます

コードの説明

NUL で埋められた文字列

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 = unpack("amd5/a10end_str", $recv_body); です

$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モードも使えて簡単です

はい、ありがとうございます

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