PHP的pack/unpack

前言:直接参照官网。

PHP: pack - Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站

PHP: unpack - Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站

1、作用

(1)pack:将数据打包成二进制字符串。将输入数据打包成format格式的二进制字符串。 

pack(string $format, mixed ...$values): string

(2)unpack:根据指定的format将二进制字符串解包成数组。

注:对于一个二进制字符串可能是由多部分组成,每部分都是一个<K,V>,多个就是k-v数组了。待会儿看个具体的例子就知道了。

unpack(string $format, string $string, int $offset = 0): array|false

支持的格式如下:

我们简单的关注下几种格式即可。

#n 无符号短整型(16位,大端字节序)  高尾端 尾端放在高地址
#v 无符号短整型(16位,小端字节序)  低尾端 尾端放在低地址
#c 有符号字符
#C 无符号字符

2、使用方式

(1)pack的使用。

#同时将4部分数据按照分别指定的格式打包为二进制字符串,格式如下。
#①将16进制数据0x1234按照n(无符号短整型(16位,大端字节序))格式打包成二进制字符串
#②将16进制数据0x5678按照v(无符号短整型(16位,小端字节序))格式打包成二进制字符串
#③将10进制数据65按照c(有符号字符)格式打包成二进制字符串
#④将10进制数据66按照c(无符号字符)格式打包成二进制字符串<?php
$binarydata = pack("nvcC", 0x1234, 0x5678, 65, 66);
print_r("packresult:" . $binarydata);  #4xVAB
print_r("<pre>");
?>

输出如下。注:后面会针对这四个元素挨个分析,明确这个“4xVAB”是怎么来的。

(2)unpack的使用。

$elems = unpack("nelem1/velem2/celem3/Celem4", $binarydata);

①知道这个二进制字符串由四部分组成,每部分的格式分别为nvcC;

②上述加了红色背景的就是指定格式,这个要和打包的时候指定的格式保持一致;

③后面紫色的elem1/elem2/elem3/elem4就是你自己取的名字,方便后续对没部分的引用。

④对照输出结果,一目了然。

#对于上面构建的二进制字符串进行unpack。
#已知其由nccC四部分组成就用着四部分就行解析即可。<?php
$binarydata = pack("nvcC", 0x1234, 0x5678, 65, 66);
print_r("packresult:" . $binarydata);  #4xVAB
print_r("<pre>");$elems = unpack("nelem1/velem2/celem3/Celem4", $binarydata);
print_r($elems);
print_r("<pre>");
?>packresult:4xVAB
Array
([elem1] => 4660[elem2] => 22136[elem3] => 65[elem4] => 66
)

输出结果如下:

 显然,4660就是0x1234的十进制结果、22136就是0x5678的十进制结果,65/66同理。

3、具体测试

分析上面这个case,看看直接打印二进制字符串的结果“4xVAB”是怎么来的。

务必对照ascii码表。百度安全验证

#输出了一个4,分析下这个4是怎么来的。
$binarydata = pack("n", 0x1234);
print_r($binarydata);  
print_r("<pre>");#0x12  Bin(00010010) Dec(18) #查询ascii码表0~31分配给了控制字符;这里的18表示"设备控制2"并不对应可见字符。
#0x34  Bin(00110100) Dec(52) #查询ascii码表对应可打印字符"4"
结论:显然4就是这么来的。$binarydata = pack("v", 0x5678);
print_r($binarydata);  #xV
print_r("<pre>");#0x56 Bin(01010110) Dec(56)   #查询ascii码表对应字符V
#0x78 Bin(01111000) Dec(120)  #查询ascii码表对应字符x
结论:又因为v表示小端字节序(低尾端,即尾端在低地址);所以先打印的顺序是xV。$binarydata = pack("c", 65);
print_r($binarydata);  
print_r("<pre>");#Dec(65) #查询ascii码表对应可见字符A
#结论:所以输出了A$binarydata = pack("c", 66);
print_r($binarydata);  
print_r("<pre>");#Dec(66) #查询ascii码表对应可见字符B
#结论:所以输出了B

注:也就是说直接利用print之类的方法直接打印二进制字符串可能并没有什么实际意义。实际能打印出来的只是这些二进制对应的ascii码而已。

其实和python的pack/unpack本质上差不多。python使用struct处理二进制数据(使用pack和unpack进行打包和解包)_calcsize函数_焱齿的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3909.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链基础之密码学及安全技术

1.2 密码学及安全技术 1.2.1 密码学知识 1.2.1.1 Hash函数 Hash(哈希) 哈希函数是一类数学函数&#xff0c;可以在有限合理的时间内&#xff0c;将任意长度的消息压缩为 固定长度的输出值&#xff0c;并且是不可逆的。其输出值称为哈希值&#xff0c;也称为散列值。 哈希算法…

Vue.js中的状态管理:理解和使用Vuex

目录 前言 Vue.js 样式绑定 Vue.js class class 属性绑定 实例 1 实例 2 实例 3 实例 4 数组语法 实例 5 实例 6 Vue.js style(内联样式) 实例 7 实例 8 实例 9 Vue.js 组件 全局组件 全局组件实例 局部组件 局部组件实例 Prop Prop 实例 动态 Prop Pro…

Linux基础服务4——ftp

文章目录 一、基本了解1.1 C/S型架构1.2 数据连接模式1.3 用户认证 二、安装服务端2.1 安装vsftpd2.2 配置文件2.3 主配置文件参数2.4 windows访问服务端2.4.1 系统用户访问2.4.2 匿名用户访问2.4.2 开启客户端上传权限2.4.3 开启客户端其他权限2.4.4 开启客户端删除、修改权限…

大数据赋能交通业务管理——远眺智慧交通集成管控系统

随着交通管理需求的不断提升&#xff0c;原有系统管理模式的缺点逐渐显露&#xff0c;各业务系统的相互独立、各自为战&#xff0c;成为交通管理人员全局把控交通资源、实现交通综合管控的壁垒。 智慧交通集成管控平台通过统一标准&#xff0c;集成交警各类业务系统、整合相关数…

解决JD-GUI-1.6.6 中文乱码

解决JD-GUI-1.6.6 中文乱码 原因解决办法的方式一解决办法的方式二最终版 原因 在拖入java文件进行反编译时候发现中文出现了乱码。 g) 解决办法的方式一 值得注意的是&#xff1a;这种方式只能每次输入命令才弹出jd-gui窗口才能不能乱码 每次打开powershell并输入这一串命…

LeetCode 0002. 两数相加

【LetMeFly】2.两数相加 力扣题目链接&#xff1a;https://leetcode.cn/problems/add-two-numbers/ 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff…

SpringBoot3之GraalVM之Windows详细安装及使用教程

配置Maven环境变量 我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 %MAVEN_HOME%\bin安装Visual Studio Community 因为GraalVM需要调用操作系统的底层工具&#xff0c;而Windows底层工具是VisualStudio&#xff0c;所以我们要先下载…

LabVIEW开发光线追踪可视化分段反射器测试台

LabVIEW开发光线追踪可视化分段反射器测试台 为了满足美国国家航空航天局&#xff08;NASA&#xff09;对未来望远镜的要求&#xff0c;新的红外空间天文台将在哈勃太空望远镜使用寿命结束后取代其。作为HST的继任者&#xff0c;詹姆斯韦伯太空望远镜&#xff08;JWST&#xf…

机器学习-方差和偏差理论

机器学习-方差和偏差理论 关于机器学习方差和偏差的内容其实很重要&#xff0c;这个方差和偏差可以帮助我们去分析&#xff0c;模型的泛化能力和过拟合的程度。 下面我们先给存储方差和偏差的公式&#xff1a; 注意&#xff0c;下式当中&#xff0c; f ( x ; D ) 表示在数据集…

Gitlab升级报错二:rails_migration[gitlab-rails] (gitlab::database_migrations line 51)

gitlab-ctl 修改文件目录后出现以下错误&#xff1a;从root --> home 先停掉gitlab: gitlab-ctl stop 单独启动数据库&#xff0c;如果不单独启动数据库&#xff0c;就会报以上错误 sudo gitlab-ctl start postgresql 解决办法&#xff1a; sudo gitlab-rake db:migrat…

登录校验-interceptor/拦截器

Interceptor 概念&#xff1a;拦截前端对后端的某些请求 使用步骤 自定义拦截器类&#xff0c;实现HandlerInterceptor接口&#xff0c;重写所有的方法&#xff08;preHandle方法在controller执行之前执行、【postHandle、afterCompletion】在controller执行后执行&#xff0…

《项目实战》构建SpringCloud alibaba项目(一、构建父工程、公共库、网关))

系列文章目录 构建SpringCloud alibaba项目&#xff08;一、构建父工程、公共库、网关&#xff09; 构建SpringCloud alibaba项目&#xff08;二、构建微服务鉴权子工程store-authority-service&#xff09; 文章目录 系列文章目录1、概要2、整体架构流程2.1、技术结构组成部分…