2013-07-10 35 views
2

我很費勁地向連接到我的PHP套接字服務器的設備發送十六進制值。在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」,並說「我需要將它轉換爲十六進制代碼爲7e的字符。在其他情況下,它會看到」\ x「,並嘗試將它得到了「7E」之前,所以不知道該怎麼辦。

PHP不解析字符串的第二次。

你需要在這種情況下做的是你的電話號碼轉換成什麼。字符表示,而不是十六進制代碼,你需要的是chr()功能,您應該能夠做這樣的事情:

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

請注意,這是skippi完全轉換十六進制轉換。另請注意,這隻適用於如果您的$ dec值爲< = 255的情況。如果您有更高的值,則需要創建自己的函數以將其分解爲多個字符。

+0

我不確定在我的問題中是否誤導了「以十六進制發送」,但實際上,這正是我所需要的......將其作爲字符發送。現在我發送字符,然後從連接的設備收到預期的結果。 – 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