2

我正在努力将十六进制值发送到连接到我的 PHP 套接字服务器的设备。

我有这个代码:

<?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”并说“我需要将其转换为十六进制代码为 7e 的字符。在其他情况下,它会看到“\x”,并尝试将其转换在它得到“7e”之前,所以它不知道该怎么做。

PHP 不会再次解析字符串。

在这种情况下,您需要做的是将您的数字转换为字符表示,而不是十六进制代码。您需要的是chr()函数。你应该能够做这样的事情:

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

请注意,它完全跳过了十六进制转换。另请注意,这仅在您的 $dec 值 <= 255 时才有效。如果您有更高的值,则需要创建自己的函数将其分解为多个字符。

于 2013-07-10T10:10:18.037 回答
0

第三种方法并不遥远。但剩下的问题是,\x将作为双引号字符串中的转义序列插入。解决方法:使用单引号:

$dec = 127;
$hex = dechex($dec);
$str3 = '\x' . $hex . '\x00MyData';
sendToDevice($str3);

一个不需要的更简单的解决方案是dechex()使用sprintf()它,因为它具有将十进制值转换为十六进制值的内部支持。现在它甚至可以是单行的:

sendToDevice(sprintf('\x%x\x00MyData', $dec));
于 2013-07-10T09:02:45.253 回答