Mar
17
2020
大小端字节序释义
经常把字节序搞懵,这里记录一下:
小端字节序(big endian),又称主机字节序(低位在前,高位在后)
因为计算机电路设计优先从低位开始处理效率高,所以又称主机字节序。
$data = pack('L*', 256); // 生成无符号长整型(32位,小端字节序)数据 for ($i = 0; $i < strlen($data); $i++) { echo bin2hex($data{$i}) . ' '; } // 00 01 00 00
大端字节序(little endian),又称网络字节序(高位在前,低位在后)
人类习惯使用`高位在前,低位在后`顺序,如金额“1234”是按千百十个位读,为识别容易,规定网络通信传输统一使用大端字节序。
$data = pack('N*', 256); // 生成无符号长整型(32位就是4字节,大端字节序)数据 for ($i = 0; $i < strlen($data); $i++) { echo bin2hex($data{$i}) . ' '; } // 00 00 01 00
另外注意:并不是所有主机字节序都是小端字节序,普通人用的桌面电脑,只要是Intel或AMD的x86/x64架构就一定是小端字节序。
很多ARM CPU可以选择数据指令字节序,不过通常也都是运行小端字节序(比如我们的智能手机)。
网络设备,像PowerPC核心的一些路由器,默认运行大端字节序。
根据主机来选择生成大/小端字节序:
$data = pack('V*', 256); // 生成无符号长整型(32位,主机字节序)数据 for ($i = 0; $i < strlen($data); $i++) { echo bin2hex($data{$i}) . ' '; } // 00 01 00 00 或 00 00 01 00
可参考PHP文档:https://www.php.net/manual/zh/function.pack.php
=================================================
转载请注明出处:
作者:Veris
最族 [ http://www.mostclan.com ]
发表评论: