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;
}
0
投稿
猜你喜欢
- 本文实例讲述了PHP实现从上往下打印二叉树的方法。分享给大家供大家参考,具体如下:问题从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 在开发过程中,有时遇到由于缓存问题导致页面不能及时更新,有时页面引入了不必需的样式脚本文件,有时由于文件太多,字节过大导致页面的性能缓慢,为
- 摘要:现代网站和web应用程序趋向于依赖客户端的大量的javascript来提供丰富的交互。特别是通过不刷新页面的异步请求来返回数据或从服务
- 本文实例讲述了JavaScript常用的返回,自动跳转,刷新,关闭语句。分享给大家供大家参考。具体如下:1. Javascript 返回上一
- 这个使用起来很简单,以前需要的时候在网上找的,用了感觉还不错,具体的看演示就明白了。,这个可以保留你文章中的html标记,需要你修改的就是下
- 启动mysql server 失败,查看/var/log/mysqld.err080329 16:01:29 [ERROR] Can'
- jquery有一个插件叫Timer,很有意思,咱来实现一个简版的yui3的node timer。但还是应当首先交代下yui3的node扩展的
- 近年来流行 Ajax,而 Ajax 的本质就是 XMLHttpRequest,是客户端 XMLHttpRequest 对象的使用。相对于 A
- javascript代码编写在页面中实现页内搜索功能,类似Word等文本编辑软件里的搜索功能,只要是页面中的字符(别管是显在的还是隐蔽在文本
- 首先我们有这么一种需求,就是我在一个列表中点击了某个item,跳转到详情界面,那么我就需要把item的实体数据从列表页面传递到详情页面,那么
- 我想把存在数据库里的每天24小时来访者数另放到一个Excel文件中去,可以吗?可以,其实就是将数据库里面的内容生成一个Excel文件:toe
- 本文实例讲述了php+mysqli使用面向对象方式更新数据库的方法,分享给大家供大家参考。具体实现方法如下:<?php//第一步:创建
- PHP fprintf() 函数实例把一些文本写入到名为 "test.txt" 的文本文件:<?php $numb
- 在网页局部的布局上,需要采用大量的自适应,来满足不同长度数据、内容的合理呈现。以此保证页面不至于因为内容过多等原因,导致重叠、溢出、撑开等破
- 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:存放到数据列中的数据类型。数据值
- 现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本
- 代码如下:USE TestDB declare @conversation uniqueidentifier while exists (s
- 在各类的前端开发工具里,在功能上虽然Editplus显得有些“单薄”,但是仍然是很多我辈做开发的人们离不开的工具,因为他小巧,语言高亮,支持
- 今天同事 明城 在项目中碰到一个 BUG,代码具体如下:<!DOCTYPE html PUBLIC "-//W3C//DTD
- Summary主要包括以下三种途径:使用独立的函数;使用torch.type()函数;使用type_as(tesnor)将张量转换为给定类型