2

PHPソケットサーバーに接続されたデバイスに16進値を送信するのに少し苦労しています。

私はこのコードを持っています:

<?PHP

# 7e hex = 126 decimal

$str1 = "\x7e\x00MyData";
sendToDevice($str1); // works :-)
# will send "~<NUL>MyData" and the device sends expected result back

$dec = 126;
$hex = dechex($dec);
$str2 = $hex . "\x00MyData";
sendToDevice($str2); // does not work :-/
# will send "7eMyData" and the device sends nothing back

$dec = 126;
$hex = dechex($dec);
$str3 = "\x$hex\x00MyData";
sendToDevice($str3); // does not work :-/
# will send "\x7e<NUL>MyData" and the device sends error report back

?>

$str1と同じように機能するように送信するにはどうすればよいですか?

4

2 に答える 2

1

これは、PHP が文字列を解析する方法によるものです。PHP が最初の文字列を解析すると、「\x7e」が表示され、「コードが 16 進数で 7e である文字に変換する必要があります。他のシナリオでは、「\x」が表示され、それを変換しようとします。 「7e」を取得する前に、何をすべきかわかりません。

PHP は文字列を 2 回解析しません。

この状況で行う必要があるのは、数値を 16 進コードではなく文字表現に変換することです。必要なのはchr()関数です。次のようなことができるはずです。

$dec = 127;
$str2 = chr($dec) . "\x00MyData";
sendToDevice($str2);

16 進変換を完全にスキップしていることに注意してください。また、これは $dec 値が <= 255 の場合にのみ機能することにも注意してください。これより高い値を取得した場合は、独自の関数を作成して複数の文字に分割する必要があります。

于 2013-07-10T10:10:18.037 に答える