我正在努力将十六进制值发送到连接到我的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 一样工作?
答案 0 :(得分:1)
这是由于PHP解析字符串的方式。当PHP解析第一个字符串时,它会看到“\ x7e”并说“我需要将其转换为十六进制代码为7e的字符。在其他情况下,它会看到”\ x“,并尝试将其转换为在它获得“7e”之前,所以它不知道该怎么做。
PHP不会再次解析字符串。
在这种情况下,您需要做的是将您的号码转换为字符表示,而不是十六进制代码。您需要的是chr()功能。你应该可以这样做:
$dec = 127;
$str2 = chr($dec) . "\x00MyData";
sendToDevice($str2);
请注意,它正在完全跳过十六进制转换。另请注意,这仅在$ dec值为&lt; = 255时有效。如果您有更高的值,则需要创建自己的函数将其分解为多个字符。
答案 1 :(得分:0)
第三种方法并不遥远。但剩下的问题是,\x
将在双引号字符串中作为escape sequence进行处理。解决方法:使用单引号:
$dec = 127;
$hex = dechex($dec);
$str3 = '\x' . $hex . '\x00MyData';
sendToDevice($str3);
不需要dechex()
的更简单的解决方案是使用sprintf()
,因为它具有将十进制值转换为十六进制值的内部支持。现在它甚至可以是一个单行:
sendToDevice(sprintf('\x%x\x00MyData', $dec));