大小端字节序释义

作者Veris 文章分类 分类:编程开发 文章评论 0条评论 阅读次数 已被围观 42

经常把字节序搞懵,这里记录一下:

小端字节序(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 ]

分类:编程开发

发表评论: