php pack 和unpack

没头脑

作者 没头脑

创建时间 2024-04-19

更新时间 2024-04-19

阅读 19

评论 0

七牛云 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的packunpack还应用于哪些场景?

  • 网络通信:在网络通信中,数据通常以二进制形式进行传输。pack 函数可以将数据打包成二进制格式,而 unpack 函数则可以从接收到的二进制数据中解析出数据字段。
  • 文件处理:在处理二进制文件时,例如图像、音频或视频文件,pack 和 unpack 可以帮助读取和写入这些文件的格式信息以及数据。
  • 处理二进制协议:与硬件或其他软件交互时,可能需要按照特定的协议格式来打包和解析数据。
  • 加密和编码:在加密和编码算法中,通常需要将数据以二进制形式进行处理。pack 和 unpack 可以帮助进行这些转换。

    引用

  1. php深入pack/unpack
  2. 百度百科
提 交
暂无评论