鍍金池/ 問答/HTML5  PHP/ strpos處理二進(jìn)制流的問題

strpos處理二進(jìn)制流的問題

$buff = pack('nn',0xabcd,0x01);
$pos =  strpos($buff,0x01);
echo $pos;

返回結(jié)果是3,0xabcd是兩個(gè)字節(jié),那么0x01的位置按照0,1,2順序,不應(yīng)該是2嗎?
回答
編輯回答
夕顏

pack參數(shù)n的意思是 16bit unsigned short, big endian(即網(wǎng)絡(luò)字節(jié)序)
所以pack出來的結(jié)果是4個(gè)字節(jié)(16 + 16 bit), ord看$buff[0],[1],[2],[3]的話分別是171, 205, 0 ,1
0x01按照ushort的話是0x0001
strpos的offset也應(yīng)該是3

171 = 16 * 10 (a) + 11 (b)
205 = 16 * 12 (c) + 13 (d)

順便: 如果pack用S參數(shù)的話, unsigned short (always 16 bit, machine byte order), 咱們常用的X86 CPU都是little endian, 所以
$buff的結(jié)果就應(yīng)該是 205, 171, 1, 0
這個(gè)時(shí)候offset就是2了

核心是字節(jié)序問題

2017年10月1日 02:40