当前位置: 首页 > news >正文

PHP - pack/unpack「字符串/二进制字符串」- 学习/实践

1.应用场景

主要用于学习和弄清楚和使用PHP中pack/unpack函数,同时弄清楚「字符串/二进制字符串」以及二进制可执行文件之间的是是非非。

本文介绍了PHP中的pack和unpack函数,它们用于处理二进制数据与字符串之间的转换。pack函数按照指定格式将数据打包为二进制字符串,支持多种数据类型(如字符、整型、浮点数)和字节序控制;unpack则反向解析二进制数据为数组。这些函数在文件处理、网络通信和数据序列化中非常有用。文章详细列举了常用格式字符,并提供了基本使用示例,同时提醒注意跨平台字节序、数据对齐和安全性问题。通过合理使用这两个函数,可以高效处理复杂二进制数据场景。

2.学习/操作

1.文档阅读

PHP: pack - Manual

PHP: unpack - Manual

PHP中的pack和unpack函数 - 掘金

php pack()函数详解与示例-php教程-PHP中文网

php - PHP中pack、unpack的详细用法_个人文章 - SegmentFault 思否 -- TBD

PHP Pack/Unpack implementation in Javascript Mismatch - Stack Overflow -- 推荐弄清楚

二进制字符串_百度百科

文件系统 - 文件类型 - 二进制/文本类型_穿素白衫的中少年的博客-CSDN博客_二进制文件

讲解二进制

关于二进制,没有比这个讲的更清楚的了_哔哩哔哩_bilibili

6. 二进制与字符串 - 理论+上机 - 敏编程入门3步曲之Python教程_哔哩哔哩_bilibili

2.整理输出

PHP 中的 pack 和 unpack 函数

pack 和 unpack 是 PHP 中用于处理二进制数据的函数,常用于将数据转换为二进制字符串或从二进制字符串中解析数据。

这些函数在文件处理、网络通信或数据序列化等场景中非常有用。

pack 函数

pack 函数将数据按照指定格式打包成二进制字符串。其基本语法如下:

string pack ( string $format , mixed $args [, mixed $... ] )

格式字符串(format)由一系列格式字符组成,每个字符对应一个参数。常见的格式字符包括:

  • a:NUL 填充的字符串
  • A:空格填充的字符串
  • h:十六进制字符串,低位在前
  • H:十六进制字符串,高位在前
  • c:有符号字符
  • C:无符号字符
  • s:有符号短整型(16位,机器字节序)
  • S:无符号短整型(16位,机器字节序)
  • n:无符号短整型(16位,大端字节序)
  • v:无符号短整型(16位,小端字节序)
  • i:有符号整型(机器相关大小和字节序)
  • I:无符号整型(机器相关大小和字节序)
  • l:有符号长整型(32位,机器字节序)
  • L:无符号长整型(32位,机器字节序)
  • N:无符号长整型(32位,大端字节序)
  • V:无符号长整型(32位,小端字节序)
  • f:浮点数(机器相关大小和表示)
  • d:双精度浮点数(机器相关大小和表示)
  • x:NUL 字节
  • X:回退一个字节
  • @:用 NUL 填充到绝对位置

示例:

$binary = pack('a5A5', 'hello', 'world');
echo $binary; // 输出:helloworld

unpack 函数

unpack 函数从二进制字符串中解析数据。其基本语法如下:

array unpack ( string $format , string $data [, int $offset = 0 ] )

格式字符串的语法与 pack 类似,但可以包含重复计数和键名。解析后的数据以关联数组形式返回。

示例:

$binary = pack('a5A5', 'hello', 'world');
$data = unpack('a5first/A5second', $binary);
print_r($data);
// 输出:
// Array
// (
//     [first] => hello
//     [second] => world
// )

使用场景

pack 和 unpack 函数常用于以下场景:

  • 处理二进制文件格式(如图像、音频文件)
  • 网络协议数据包的构造和解析
  • 数据序列化和反序列化
  • 跨平台数据交换(确保字节序一致)

注意事项

  • 字节序问题:不同平台可能使用不同的字节序(大端或小端),跨平台数据交换时需明确指定。
  • 数据对齐:某些平台要求数据按特定边界对齐,需使用填充字符处理。
  • 安全性:处理二进制数据时需注意缓冲区溢出等安全问题。

通过合理使用 pack 和 unpack 函数,可以高效地处理二进制数据,满足各种复杂场景的需求。

后续补充

...

3.问题/补充

1. 有符号和无符号字符

PHP中的pack是为了将把数据装入一个二进制字符串:

unpcak则是相反

后续补充

...


文章转载自:

http://EM8JyIeR.qxkcx.cn
http://MRqYarH1.qxkcx.cn
http://qDLIbnBh.qxkcx.cn
http://efuuzhPW.qxkcx.cn
http://t2ut2o6i.qxkcx.cn
http://8g653PrI.qxkcx.cn
http://zqDFNSlz.qxkcx.cn
http://O5ykG5ye.qxkcx.cn
http://tP3mQw4q.qxkcx.cn
http://vQFoaya3.qxkcx.cn
http://Nd5enaec.qxkcx.cn
http://NpTVgUl4.qxkcx.cn
http://3ZdRF3nU.qxkcx.cn
http://yvXqN2Z3.qxkcx.cn
http://wRFKmdDU.qxkcx.cn
http://p73G6oKB.qxkcx.cn
http://D7g1UJJV.qxkcx.cn
http://PR8s2duI.qxkcx.cn
http://Ujzsw4Dg.qxkcx.cn
http://Xzz6C6Gj.qxkcx.cn
http://4o4uqexU.qxkcx.cn
http://WtoPIK8Y.qxkcx.cn
http://Rp9UA7v3.qxkcx.cn
http://Ok3OcBku.qxkcx.cn
http://2MCZ1zJY.qxkcx.cn
http://vJKi3UOP.qxkcx.cn
http://STs0tFfY.qxkcx.cn
http://LloyNngi.qxkcx.cn
http://zjVIqf6q.qxkcx.cn
http://6WSErHao.qxkcx.cn
http://www.dtcms.com/a/371005.html

相关文章:

  • UE5 图表、函数与宏的区别与选择(蓝图折叠功能详解)
  • 实体商业破局思考:从多重困境到多方共赢,创新模式的价值在哪?
  • 中州养老项目:利用Redis解决权限接口响应慢的问题
  • 轻量应用服务器具体指的是什么?
  • 3.进程调度:常见算法
  • LeetCode - 202. 快乐数
  • Docker容器安全最佳实践:镜像扫描、权限控制与逃逸防范
  • 【攻防实战】浅谈Cobalt Strike远控实战
  • 优化MySQL分区表备份流程详解
  • 《论文阅读》贴纸对多模态聊天情感分析和意图识别的影响:一个新的任务、数据集和基线 ACM MM 2025
  • 主数据系统是否对于企业是必需的?
  • 深入理解 RequestContextHolder、ThreadLocal 与 RequestContextFilter
  • GD32入门到就业37--文件系统于FatFs
  • 从零到一构建企业级AI向量服务:AntSK-PyApi深度技术解析
  • 昇腾310i Pro固件说明
  • 【CMake】变量作用域2——函数作用域
  • 计组——指令流水线
  • Python爬虫实战:研究Event Handling机制,构建在线教育平台的课程数据采集和分析系统
  • 【开题答辩全过程】以 校园车辆管理系统为例,包含答辩的问题和答案
  • (算法 哈希表)【LeetCode 242】有效的字母异位词
  • MyBatis入门到精通:CRUD实战指南
  • 【LeetCode热题100道笔记】腐烂的橘子
  • 一种基于迁移学习的零样本故障诊断方法
  • 责任链框架 03:处理器实现
  • STM32项目分享:基于物联网的健康监测系统设计
  • 13-Java-面向对象-封装和this关键字
  • docker安装redis(8.2.1)
  • 【精品文档】步进电机原理讲解和程序控制步进电机加减速运动
  • Nessus漏扫工具安装保姆级教学Linux篇
  • Adobe Illustrator(Ai) 2022矢量设计软件的安装教程与下载地址