在PHP中以十六进制发送

时间:2013-07-10 08:57:47

标签: php php-socket

我正在努力将十六进制值发送到连接到我的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 一样工作?

2 个答案:

答案 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));