2011-01-06 110 views
1

爲什麼pack('i',6)這樣的代碼返回0?函數包()返回0

所有php.net說,關於這個函數的返回值:

返回包含 數據的二進制字符串。

+1

你怎麼知道它返回0,你在做什麼返回值? – 2011-01-06 13:09:42

+0

格式我也是機器相關的,你認爲它應該返回什麼? – 2011-01-06 13:11:58

回答

9

你必須在這裏更具體。什麼是返回類型?這是一個二進制字符串,通常你看到的不是它實際包含的內容。

它可能以幾個空字節開始(即值= 0,\0 char)。由於該字節用於表示C語言和其他語言中的字符串結尾,因此echo和其他函數在遇到空字節時會停止(有時手冊中提到函數是'二進制安全的',這意味着它不會將空字節視爲字符串結束)。

此外還有很多不可打印的字符。它們通常具有某種特殊的含義(例如,字符7是「鍾」命令,將其鍵入到您的shell中以便嘗試使用php -r 'echo "\7";')。

要找出字符串中的內容,可以將每個字符轉換爲其十六進制表示形式。你可以使用bin2hex()這個,注意它需要兩個字符來表示輸入字符串的一個字符。

$ php -r 'var_dump(bin2hex(pack("i",6)));' 
string(8) "06000000" 

(您在上面看到的輸出取決於你的硬件。)在我的情況pack('i', 6);返回整數little-endian格式,因爲我有一個英特爾處理器。

您可以看到第一個字符(06)的十進制值爲6.然後,您通常會查找它屬於哪個字符。在很多情況下可以使用ASCII表,但請注意,如果您使用unicode或任何其他編碼,某些字符可能會有其他含義。根據我的ASCII表格,這是ACK character。這是一個不可打印的字符,它只有控制功能。

還有待解釋的是爲什麼這會轉化爲整數0.幸運的是,這非常簡單。閱讀casting strings to numbers上的PHP手冊頁。

如果字符串以有效 數字數據開始,這將是使用的值 。否則,該值將爲0 (零)。

由於\6炭既不是一個標誌,也不是數字(字符的0-9都是十進制\48 - \57\0x30 - \0x39十六進制)PHP返回零。