七牛云 php-sdk有这样一段源码,看了之后一头雾水
/**
* 计算输入流的crc32检验码
*
* @param $data string 待计算校验码的字符串
*
* @return string 输入字符串的crc32校验码
*/
function crc32_data($data)
{
$hash = hash('crc32b', $data);
$array = unpack('N', pack('H*', $hash));
return sprintf('%u', $array[1]);
}
需要了解的基本知识
什么是字节序
在目前各种体系的计算机中,采用的字节存储机制主要有两种:大端(Big-endian)和小端(Little-endian)
MSB和LSB
- MSB: Most Significant Bit/Byte首字母的缩写,通常译为最重要的位或字节。通常用来表示在一个字节(Bit)序列或位(Byte)序列中对整个序列取值影响最大的位(Bit)或字节(Byte)
- LSB: Least Significant Bit/Byte首字母的缩写,通常译为最不重要的位或字节。通常用来表示在一个字节(Bit)序列或位(Byte)序列中对整个序列取值影响最小的位(Bit)或字节(Byte)
- 对于一个十六进制int类型整数0x12345678来说,0x12就是MSB,0x78就是LSB。而对于0x78这个字节而言,它的二进制是01111000,那么最左边的那个0就是MSB,最右边的那个0就是LSB
大端序
- 大端序又叫网络字节序。大端序规定高位字节存储时放在低位上,在传输时,高位字节放在流的开始
小端序
- 小端序规定高位字节在存储时放在高地址上,在传输时高位字节放在流的末尾;低位字节在存储时放在低地址上,在传输时低位字节放在流的开始
字节序相关的总结
- 字节序只针对于多字节类型的数据。比如对于int类型整数0x12345678,它占有4个字节的存储空间,存储方式有大端(0x12, 0x34, 0x56, 0x78)和小端(0x78, 0x56, 0x34, 0x12)两种。可以看到,在大端或小端的存储方式中,是以字节为单位的。所以对于单字节类型的数据,不存在字节序这个说法。
crc
crc是 Cyclic Redundancy Check的缩写,译为循环冗余校验。通常用于数据存储和数据通讯领域,目的是保证数据的正确性。hash('crc32b', $data)
等同于str_pad(dechex(crc32($str)), 8, '0', STR_PAD_LEFT)
总结
上面的代码用于验证上传数据的完整性,计算字符串的crc32多项式
function crc32_data($data)
{
$checksum = crc32($data);
// 因为Php的数字是有符号的,可能会获取一个<0的值,所以需要sprint获取无符号整型
return sprintf('%u', $array[1]);
}
一些思考
php的pack
和unpack
还应用于哪些场景?
- 网络通信:在网络通信中,数据通常以二进制形式进行传输。pack 函数可以将数据打包成二进制格式,而 unpack 函数则可以从接收到的二进制数据中解析出数据字段。
- 文件处理:在处理二进制文件时,例如图像、音频或视频文件,pack 和 unpack 可以帮助读取和写入这些文件的格式信息以及数据。
- 处理二进制协议:与硬件或其他软件交互时,可能需要按照特定的协议格式来打包和解析数据。
- 加密和编码:在加密和编码算法中,通常需要将数据以二进制形式进行处理。pack 和 unpack 可以帮助进行这些转换。
引用
暂无评论