2013-07-10 2 views
2

Я немного пытаюсь отправить шестнадцатеричное значение устройству, подключенному к моему серверу сокетов PHP.Отправить как hex в 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

Что вы подразумеваете под "не работает: - /"? Вы получаете сообщение об ошибке? – Dahaka

+0

Вот что я заметил. Когда он заключен в двойные кавычки, PHP, похоже, оценивает шестнадцатеричные числа. Например, вывод 'print_r (" \ x7f \ x00MyData ");' и 'print_r ('\ x7f \ x00MyData');' не то же самое. Может быть, это поможет вам. Также см. Http://codepad.org/GbbhYouP. – xbonez

+0

Пожалуйста, добавьте исходный код 'sendToDevice()'. В противном случае это просто гадание – hek2mgl

ответ

1

Это связано с тем, как PHP анализирует строки. Когда PHP анализирует первую строку, он видит «\ x7e» и говорит: «Мне нужно преобразовать это в символ, код которого равен 7е в шестнадцатеричном формате. В других сценариях он видит« \ x »и пытается преобразовать это прежде чем он получает «7е», поэтому он не знает, что делать.

PHP не разобрать Струны второй раз.

Что вам нужно сделать в этой ситуации превратить ваш номер . представление символов, а не шестнадцатеричный код что вам нужно, это chr() функция вы должны быть в состоянии сделать что-то вроде этого:.

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

Заметим, что это Skippi вообще говоря, шестнадцатеричное преобразование. Также обратите внимание, что это работает, только если ваше значение $ dec равно < = 255. Если у вас есть более высокие значения, вам нужно создать свою собственную функцию, чтобы разбить ее на несколько символов.

+0

Я не уверен, что я вводил в заблуждение в своем вопросе «отправить как шестнадцатеричный», но на самом деле это было именно то, что мне нужно ... чтобы отправить его как символ. Теперь я отправляю char, и я получил ожидаемый результат от подключенного устройства. – DHS

0

Третий подход не так далеко. Но остающаяся проблема в том, что \x будет интерпретирован как escape sequence в двойных кавычках. Решение: Используйте одинарные кавычки:

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

Более простым решением, которое не нуждается в dechex() будет использовать sprintf() поскольку он имеет внутреннюю поддержку для преобразования десятичных значений в шестнадцатеричные значения. Теперь это может быть даже однострочный:

sendToDevice(sprintf('\x%x\x00MyData', $dec)); 
+0

Это не работает для меня - см. мой обновленный пост, где я пишу, что я вижу, он отправляет на устройство. Я также пробовал одиночную/двойную цитату, но она тоже не работала. Мне нужно отправить шестнадцатеричное значение, а не интерпретацию текста. – DHS