php使用pack处理二进制文件的方法
作者:shichen2014 发布时间:2023-11-21 04:26:11
标签:php,pack,二进制文件
php读写二进制文件可以使用pack和unpack函数。
今天要处理一个二进制文件的问题,所以需要用一下,特意了解一下pack的用法,unpack用法与此类似。
简单来说,pack函数就是给一个目标格式,和相应的参数,就可以返回二进制数据了。
下面举例加以说明,对于四个整数:
pack("L4", 0,1,2,3)
pack("LLLL", 0,1,2,3)
pack("L", 0).pack("L", 1).pack("L", 2).pack("L", 3)
上面的处理结果是一样的,也就是说,format是描述后面的数据的格式。
至于具体format可以用什么,看看format characters就知道了。
比如一个30字符的 pack("a30", "https://www.aspxhome.com") ,就是这个意思,很简单
pack函数的官方声明如下:
引用
pack
(PHP 3, PHP 4, PHP 5)
pack -- Pack data into binary string
Description
string pack ( string format [, mixed args [, mixed ...]] )
Pack given arguments into binary string according to format. Returns binary string containing data.
The idea to this function was taken from Perl and all formatting codes work the same as there, however, there are some formatting codes that are missing such as Perl's "u" format code. The format string consists of format codes followed by an optional repeater argument. The repeater argument can be either an integer value or * for repeating to the end of the input data. For a, A, h, H the repeat count specifies how many characters of one data argument are taken, for @ it is the absolute position where to put the next data, for everything else the repeat count specifies how many data arguments are consumed and packed into the resulting binary string. Currently implemented are
表格 1. pack() format characters
Code Description
a NUL-padded string
A SPACE-padded string
h Hex string, low nibble first
H Hex string, high nibble first
c signed char
C unsigned char
s signed short (always 16 bit, machine byte order)
S unsigned short (always 16 bit, machine byte order)
n unsigned short (always 16 bit, big endian byte order)
v unsigned short (always 16 bit, little endian byte order)
i signed integer (machine dependent size and byte order)
I unsigned integer (machine dependent size and byte order)
l signed long (always 32 bit, machine byte order)
L unsigned long (always 32 bit, machine byte order)
N unsigned long (always 32 bit, big endian byte order)
V unsigned long (always 32 bit, little endian byte order)
f float (machine dependent size and representation)
d double (machine dependent size and representation)
x NUL byte
X Back up one byte
@ NUL-fill to absolute position
看累了英文,下面来看看对应的中文解释:
引用
pack()函数的作用是:将数据压缩成一个二进制字符串。
a - NUL-padded string
a - NUL- 字符串填满[padded string]
A - SPACE-padded string
A - SPACE- 字符串填满[padded string]
h - Hex string, low nibble first
h – 十六进制字符串,低“四位元”[low nibble first]
H - Hex string, high nibble first
H - 十六进制字符串,高“四位元”[high nibble first]
c - signed char
c – 带有符号的字符
C - unsigned char
C – 不带有符号的字符
s - signed short (always 16 bit, machine byte order)
s – 带有符号的短模式[short](通常是16位,按机器字节顺序)
S - unsigned short (always 16 bit, machine byte order)
S – 不带有符号的短模式[short](通常是16位,按机器字节排序)
n - unsigned short (always 16 bit, big endian byte order)
n -不带有符号的短模式[short](通常是16位,按大endian字节排序)
v - unsigned short (always 16 bit, little endian byte order)
v -不带有符号的短模式[short](通常是16位,按小endian字节排序)
i - signed integer (machine dependent size and byte order)
i – 带有符号的整数(由大小和字节顺序决定)
I - unsigned integer (machine dependent size and byte order)
I – 不带有符号的整数(由大小和字节顺序决定)
l - signed long (always 32 bit, machine byte order)
l– 带有符号的长模式[long](通常是32位,按机器字节顺序)
L - unsigned long (always 32 bit, machine byte order)
L – 不带有符号的长模式[long](通常是32位,按机器字节顺序)
N - unsigned long (always 32 bit, big endian byte order)
N – 不带有符号的长模式[long](通常是32位,按大edian字节顺序)
V - unsigned long (always 32 bit, little endian byte order)
V– 不带有符号的长模式[long](通常是32位,按小edian字节顺序)
f - float (machine dependent size and representation)
f –浮点(由大小和字节顺序决定)
d - double (machine dependent size and representation)
d – 双精度(由大小和字节顺序决定)
x - NUL byte
x – 空字节[NUL byte]
X - Back up one byte
X- 后面一个字节[Back up one byte]
@ - NUL-fill to absolute position
@ - NUL- 添加到一个绝对位置[absolute position]
示例代码如下:
<?php
$code=array(
"username"=>array("A7","张三adfb12"),
"pass"=>array("A10","asdf*#1"),
"age"=>array("C","23"),
"birthday"=>array("I","19900101"),
"email"=>array("A50","www.aspxhome.com"));
$stream=join("\0",parkByArr($code));
echo $stream,strlen($stream);
file_put_contents("1.txt",$stream);//将流保存起来便于下面读取
function parkByArr($arr)
{
$atArr=array();
foreach ($arr as $k=>$v)
{
$atArr[]=pack($v[0],$v[1]);
}
return $atArr;
}
function getAscill($str)
{
$arr=str_split($str);
foreach ($arr as $v)
{
echo $v,"=",ord($v),"\n";
}
}
$code=array(
"username"=>array("A20"),
"pass"=>array("A10"),
"age"=>array("C"),
"birthday"=>array("I"),
"email"=>array("A50"));
$stream=file_get_contents("1.txt");
var_dump(parkByArr($stream,$code));
function parkByArr($str,$code)
{
$Arr=explode("\0",$str);
$atArr=array();
$i=0;
foreach ($code as $k=>$v)
{
$atArr[$k]=unpack($v[0],$Arr[$i]);
$i++;
}
return $atArr;
}


猜你喜欢
- <% Rem Rem ## 在线升级类声明 Class Cls_oUpdate
- 而str.replace(/\-/g,"!")则可以全部替换掉匹配的字符(g为全局标志)。replace()The re
- Go语言没有继承、构造函数和析构函数等概念,但是它是面向对象的。.net中类型系统分为值类型和引用类型,两种转换需要进行装箱和拆箱,都是继承
- 一、简介此模块用于简化paramiko与网络设备之间的ssh连接,可在windows与Unix平台使用 二、目前支持的设备(201
- 前言在我们实际开发中,经常需要将一组数据存储起来,以便使用。如果学习了其他的语言可能知道数组(Array)这个数据结构,它就可以将多个数据进
- 本文实例讲述了Python使用wget实现下载网络文件功能。分享给大家供大家参考,具体如下:wget是一个从网络上自动下载文件的自由工具。它
- 在sql语句中,我们难免会用到单引号嵌套的时候,但是直接嵌套肯定是不行的,java中用反斜杠做转义符也是不行的,在sql中是用单引号来做转义
- IDEA 插件安装 步骤IDEA里面,选择打开 File --> Settings --> Plugins在Plugins里面,
- 一、前言1.1 关于描述性统计分析概括地来说,描述性统计分析就是在收集到的数据的基础上,运用制表和分类,图形以及计算概括性数据来描述数据特征
- Matplotlib是一个很好的作图软件,但是python下默认不支持中文,所以需要做一些修改,方法如下:1.在python安装目录的Lib
- DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。一、管理用户1、创建用户
- 最近在学习仿站内容,需要用到phpstudy,在下载phpstudy后想要启动MySQL服务,但是总是无法启动。主要原因是之前已经在本地安装
- 本文实例讲述了Python Django中间件,中间件函数,全局异常处理操作。分享给大家供大家参考,具体如下:应用名/middleware.
- 引言本篇是以python的视角介绍相关的函数还有自我使用中的一些问题,本想在这篇之前总结一下opencv编译的全过程,但遇到了太多坑,暂时不
- 前言在大多数介绍 Buffer 的文章中,主要是围绕数据拼接和内存分配这两方面的。比如我们使用fs模块来读取文件内容的时候,返回的就是一个
- QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完
- 这篇文章主要介绍了如何基于pythonnet调用halcon脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 今天项目上遇到一个问题,需要在点击a标签时,将完整的内容显示出来原先是想用jquery的click方法<a ownattr=“……”
- 一直不用这个phpmyadmin,在本机也是用navicat,总感觉phpmyadmin速度较慢。这回不行了,没有独立主机,只好用人家给的p
- 前端代码要做到简洁易读、高效,还要考虑后端嵌套的方便性。前段时间做了一个导航,把整个制作过程重现,希望对大家有帮助。看到这样的导航,你会怎么