5

PHPソケットを使用してネットワーク接続を介してPHPスクリプトからC#アプリにJSONメッセージを送信したいと思います。

通常、バイナリプロトコルの場合、すべてのメッセージの最初の4バイトは、メッセージの長さ(バイト数)を表す整数である必要があります。

C#では、すべてのメッセージの前に、メッセージの長さを示す整数を次のように付けます。

byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");            
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length);
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length];
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length);
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length);

私が理解しているように、PHPでは関数socket_sendは文字列のみを受け入れます。では、PHP 5.xで同じプレフィックスを作成するにはどうすればよいですか?

更新:ネットワークソケットから受信したときにそのようなプレフィックス付きデータを処理する方法についてのフォローアップ質問を投稿しました。

4

2 に答える 2

6

PHPでは、文字列はバイナリです。

したがって、整数の長さの値を、 n個の符号なし整数のバイナリ表現として4文字(4オクテット; 32ビット)の文字列としてエンコードする必要があります。参照してくださいpack

# choose the right format according to your byte-order needs:

l   signed long (always 32 bit, machine byte order)
L   unsigned long (always 32 bit, machine byte order)
N   unsigned long (always 32 bit, big endian byte order)
V   unsigned long (always 32 bit, little endian byte order)

$string = pack('l', $length);
于 2012-03-16T18:26:29.727 に答える
6

pack()を使用して、バイト数をバイナリ文字列に変換できると思います。ネットワーク経由でデータを送信するときは、おそらく「N」形式(符号なしロング、常に32ビット、ビッグエンディアンバイトオーダー)を使用して変換する必要があります。

次に例を示します。

$s="Hello World";
$length=pack("N",strlen($s));
socket_send($sock,$length.$s,4+strlen($s));
于 2012-03-16T18:32:26.700 に答える