当前位置: 首页 > 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://www.xdnf.cn/news/1477405.html

相关文章:

  • Week 15: 深度学习补遗:集成学习初步
  • C++算法学习——链表
  • 基于Scikit-learn集成学习模型的情感分析研究与实现
  • Day12--HOT100--23. 合并 K 个升序链表,146. LRU 缓存,94. 二叉树的中序遍历
  • 腾讯混元翻译模型Hunyuan-MT-7B开源,先前拿了30个冠军
  • Go基础(③Cobra)
  • STM32——Flash闪存
  • 自动化运维,ansible综合测试练习题
  • Ceph分布式存储全解析:从了解到使用
  • 新能源研发,用新型实验记录本:ELN
  • 006-Dephi 表达式 选择语句 循环语句其他语句
  • k8s网络原理
  • Qt自定义列表项与QListWidget学习
  • PID控制技术深度剖析:从基础原理到高级应用(六)
  • LeetCode 刷题【66. 加一、67. 二进制求和】
  • Linux bzip2 命令使用说明
  • 大数据毕业设计选题推荐-基于大数据的宫颈癌风险因素分析与可视化系统-Spark-Hadoop-Bigdata
  • Day22_【机器学习—集成学习(2)—Bagging—随机森林算法】
  • 学习nginx location ~ .*.(js|css)?$语法规则
  • Error metrics for skewed datasets|倾斜数据集的误差指标
  • 区块链论坛社区
  • 在 ES6 中如何提取深度嵌套的对象中的指定属性
  • 【111】基于51单片机停车场车位管理系统【Proteus仿真+Keil程序+报告+原理图】
  • 从RAW到BMP:工业视觉系统图像格式的转换与优化
  • 数据结构之二叉树(1)
  • STM32-----SPI
  • JUC、JVM八股补充
  • YOLOv8 在 Intel Mac 上的 Anaconda 一键安装教程
  • JBoltAI:赋能AI数智化升级的Java级引擎——深入解析企业级AI开发框架的核心能力与行业价值
  • 待定系数法分解分式