请教下php的php c unpackk("C2chars", $bin)的C2chars什么意思啊

在用上传文件时一般限制可上传的文件类型的做法是通过文件的后缀进行判断,但这样的做法存在缺点,相信所有的phper们都是知道的,下面介绍一个可以从最根本上判断用户上传的文件类型的函数。
简要分析一下本函数通过文件头信息实现判断上传文件类型的过程思路,首先使用用fopen()函数打开上传的文件,然后通过fread()读取文件的前2个字节。得到的内容会是二进制的字符串,为了能在程序代码中做判断,这里使用的是unpack()函数把二进制数据转换成十进制数字的字符串(unpack()函数主要用于二进制操作,具体用法可参见php帮助文档,这里做解释!),然后进行判断即可。
下面直接把案例代码贴出来吧:
$filename='http://www.daimajiayuan.com/logo.gif';&$file=fopen($filename,'rb');&$bin=fread($file,2);&&fclose($file);&$strInfo=@unpack('c2chars',$bin);&$typeCode=intval($strInfo['chars1'].$strInfo['chars2']);&$fileType='';&switch&($typeCode){&&&&&case&7790:&&&&&&&&&$fileType='exe';&&&&&break;&&&&&case&7784:&&&&&&&&&$fileType='midi';&&&&&break;&&&&&case&8297:&&&&&&&&&$fileType='rar';&&&&&break;&&&&&case&255216:&&&&&&&&&$fileType='jpg';&&&&&break;&&&&&case&7173:&&&&&&&&&$fileType='gif';&&&&&break;&&&&&case&6677:&&&&&&&&&$fileType='bmp';&&&&&break;&&&&&case&13780:&&&&&&&&&$fileType='png';&&&&&break;&&&&&default:&&&&&&&&&echo&'unknown';&&&&&break;&}&echo&'文件类型:'.$fileType.'&文件头信息:'.$typeCode;&
也许你会喜欢和关注与本文内容高度相关的文章:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)php通过pack和unpack函数实现对二进制数据封装及解析
我的图书馆
php通过pack和unpack函数实现对二进制数据封装及解析
1. pack和unpack格式字符串解析:
a一个填充空的字节串
A一个填充空格的字节串
b一个位串,在每个字节里位的顺序都是升序
B一个位串,在每个字节里位的顺序都是降序
c一个有符号char(8位整数)值
C一个无符号char(8位整数)值;关于Unicode参阅U
d本机格式的双精度浮点数
f本机格式的单精度浮点数
h一个十六进制串,低四位在前
H一个十六进制串,高四位在前
i一个有符号整数值,本机格式
I一个无符号整数值,本机格式
l一个有符号长整形,总是32位
L一个无符号长整形,总是32位
n一个16位短整形,“网络”字节序(大头在前)
N一个32位短整形,“网络”字节序(大头在前)
p一个指向空结尾的字串的指针
P一个指向定长字串的指针
q一个有符号四倍(64位整数)值
Q一个无符号四倍(64位整数)值
s一个有符号短整数值,总是16位
S一个无符号短整数值,总是16位,字节序跟机器芯片有关
u一个无编码的字串
U一个Unicode字符数字
v一个“VAX”字节序(小头在前)的16位短整数
V一个“VAX”字节序(小头在前)的32位短整数
w一个BER压缩的整数
x一个空字节(向前忽略一个字节)
X备份一个字节
Z一个空结束的(和空填充的)字节串
(1).每个字母后面都可以跟着一个数字,表示count(计数,如果count是一个*表示剩下的所有东西。
(2)如果你提供的参数比$format要求的少,pack假设缺的都是空值。如果你提供的参数比$format要求的多,那么多余的参数被忽略。
2.php通过socket和java server通信
& php跟java进行socket通讯的时候,php发送一段数据给java,(协议自定,这里假定类型10表示获取游戏邮件列表,10000表示获取的id) &
socket_write($sock,pack('CN',10,10000),5);
&java接受到后,会返回一段数据,从中获得你所需要的,比如java先告诉你返回内容规则如下:1 byte,2 int
&php可以通过如下方式获得:
$arr=unpack('Csuccess/Nid/Ncount',$data);
这样就完成一次解析过程.
&这里我们都没有提到字符串的发送,我们知道字符串在字节流里的存储方式是前2个字节表示字符串的长度,后面表示字符串的具体内容(学过java的应该都了解),2个字节也就限制了发送长度最大为65536,因而我们要发送字符串需要如下(以下举例都在utf8下完成):
function&pack_str($str){
&&$utflen&=&strlen($str);
&&if&($utflen&& 65535)&die('too long');
&&$in&.= pack('C2',$utflen&&8,$utflen&&0);
&&return&$in.$str;
比如我们要向游戏服务器内发送一个公告:各位,服务器在1小时内重起!假设java要求这样的格式:协议号:int,标题,内容。我们就可以如下发送:
$in=pack('N',1000);
$in.=pack_utf8('公告');
$in.=pack_utf8('各位,服务器在1小时内重起!');
这样就完成一次发送.同样如果我们需要读取游戏服务器的数据,比如用户资料,也会返回字符串,原理同上,先读2个字节获取长度,再根据长度来获取具体的内容,代码如下:
$crt_str&&=unpack("C{$crt_str_len}str",$data);
&&&&&&for($ii=1;$ii&=$crt_str_len;$ii++){
&&&&&&&$str&.=&chr($crt_str['str'.$ii]);
$str就是我们要获取的中文,但是这样极其烦琐,如果有多个字符串的话,中间又包含了其他数据,比如返回为int,string,int,byte,string这样处理起来相当不便,于是提供下面的函数供大家参考:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&function&rs_unpack($parse,$data)
&&&&$parselen&&&&&&&&=&strlen($parse);
&&&&$parsepos&&&&&&&&= 0;
&&&&$datapos&&&&&&&&= 0;
&&&&$argc&&&&&&&&&&&&&&&&= 1;
&&&&$ret&&&&&&&&&&&&&&&&=&array();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&while($parsepos&$parselen){
&&&&&&&&&&&&$dostr&&&&&&&&&&&&&&&&=
&&&&&&&&&&&&$type&&&&&&&&=&substr($parse,$parsepos++,1);
&&&&&&&&&&&&switch($type){
&&&&&&&&&&&&&&case&'b':
&&&&&&&&&&&&&&&&&&&&&&$size&&&&&&&&= 1;
&&&&&&&&&&&&&&&&&&&&&&$argv&&&&&&&&.=&'C';
&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&case&'s':
&&&&&&&&&&&&&&&&&&&&&&$size&&&&&&&&= 2;
&&&&&&&&&&&&&&&&&&&&&&$argv&&&&&&&&.=&'n';
&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&case&'i':
&&&&&&&&&&&&&&&&&&&&&&$size&&&&&&&&= 4;
&&&&&&&&&&&&&&&&&&&&&&$argv&&&&&&&&.=&'N';
&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&case&'Z':
&&&&&&&&&&&&&&&&&&&&&&$dostr&&&&&&&&=
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&$arr&&&&&&&&= unpack($argv,substr($data,$datapos,$argvlen));
&&&&&&&&&&&&&&&&&&&&&&$datapos&&&&&&&&+=&$argvlen;
&&&&&&&&&&&&&&&&&&&&&&$argvlen&&&&&&&&= 0;
&&&&&&&&&&&&&&&&&&&&&&$argv&&&&&&&&&&&&&&&&=&'';
&&&&&&&&&&&&&&&&&&&&&&$ret&&&&&&&&=&array_merge($ret,$arr);
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&if($parsepos&$parselen)&&&&&&&&$argc&&&&&&&&=&intval(substr($parse,$parsepos));
&&&&&&&&&&&&&&&&&&&&&&if($argc==0)&&&&&&&&$argc&&&&&&&&= 1;
&&&&&&&&&&&&&&&&&&&&&&while($parsepos&$parselen){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$type&&&&&&&&=&substr($parse,$parsepos,1);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if($type&='0'&&$type&='9'){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$parsepos++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&$namepos=&$parsepos;
&&&&&&&&&&&&&&&&&&&&&&$type&&&=&'';
&&&&&&&&&&&&&&&&&&&&&&while($parsepos&$parselen){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$type=&substr($parse,$parsepos,1);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$parsepos++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$namelen++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if($type=='/')&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&$strname&=&substr($parse,$namepos,$parsepos-$namepos-($type=='/'1:0));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&for($i=0;$i&$argc;$i++){
&&&&&&&&&&&&&&&&&&&&&&&&&&$str=&'';
&&&&&&&&&&&&&&&&&&&&&&&&&&$crt_len_arr&= unpack('nstr_len',substr($data,$datapos,2));
&&&&&&&&&&&&&&&&&&&&&&&&&&$datapos+= 2;
&&&&&&&&&&&&&&&&&&&&&&&&&&$crt_str_len&=&$crt_len_arr['str_len'];
&&&&&&&&&&&&&&&&&&&&&&&&&&$crt_str&= unpack("C{$crt_str_len}str",substr($data,$datapos,$crt_str_len));
&&&&&&&&&&&&&&&&&&&&&&&&&&for($ii=1;$ii&=$crt_str_len;$ii++){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$str.=&chr($crt_str['str'.$ii]);
&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&$ret=&array_merge($ret,array($strname.($argc&1?($i+1):'')=&$str));
&&&&&&&&&&&&&&&&&&&&&&&&&&$datapos+=&$crt_str_len;
&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&&&&&&&die('parse error');
&&&&&&&&&&&&}
&&&&&&&&&&&&if($dostr)&&&&&&&&continue;
&&&&&&&&&&&&
&&&&&&&&&&&&if($parsepos&$parselen)&&&&
&&&&&&&&&&&&&&&$argc&&=&intval(substr($parse,$parsepos));
&&&&&&&&&&&&if($argc==0){
&&&&&&&&&&&&&&&&&&&&$argc&= 1;
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&if($argc&200)&&&&
&&&&&&&&&&&&&&&&&&&&&&$argc= 200;
&&&&&&&&&&&&}
&&&&&&&&&&&&$argvlen+=&$argc*$size;
&&&&&&&&&&&&
&&&&&&&&&&&&while($parsepos&$parselen){
&&&&&&&&&&&&&&&&&&&&$type&=&substr($parse,$parsepos,1);
&&&&&&&&&&&&&&&&&&&&$argv&.=&$type;
&&&&&&&&&&&&&&&&&&&&$parsepos++;
&&&&&&&&&&&&&&&&&&&&if($type=='/')&break;
&&&&&&&&&&&&}
&&&&if(!empty($argv)){
&&&&&&&&&&&&$ret&=&array_merge($ret,unpack($argv,substr($data,$datapos)));
&&&&return&$ret;
&&function&pack_str($str){
&&&&&&&&&&$utflen&=&strlen($str);
&&&&&&&&&&if&($utflen&& 65535)&&&&
&&&&&&&&&&&&&die('too long');
&&&&&&&&&&$in&&.= pack('C2',$utflen&&8,$utflen&&0);
&&&&&&&&&&return&$in.$str;
&&$in&&.= pack('C',10);
&&$in&&.= pack_str("标题");
&&$in&&.= pack('C',10);
&&$in&&.= pack_str("内容");
&&print_r(rs_unpack('bbyte/Zstr/be/Zstrw',$in));
&&$in&&&&&&&&= pack('N',1000);
&&$in&&&&&&&&.= pack_str("公告");
&&$in&&&&&&&&.= pack_str("服务器在10分钟内重启!");
&&print_r(rs_unpack('i/Ztitle/Zcontent',$in));
&&print_r(rs_unpack('i/Z2str',$in));
需要注意的是:
(1)很多服务器都会用utf8编码的格式,所以我们的php文件也必须使用同样的编码,否则会出乱码,或其他问题
(2)该函数我只处理了4种类行,并且参数用java的类型代替了unpack原来的参数类型,如需处理其他类型,请自行修改。
2.其它举例:
$data&=&"PHP";
print_r(unpack("C*",$data));
$data&=&"PHP";
print_r(unpack("C*myint",$data));
[myint1] =& 80
[myint2] =& 72
[myint3] =& 80
$bin&= pack("c2n2",0x8,65,66);
print_r(unpack("c2chars/n2int",$bin));
[chars1] =& 52
[chars2] =& 120
[int1] =& 65
[int2] =& 66
169IT站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.转载请注明:文章转载自:[]本文标题:
喜欢该文的人也喜欢杂项函数库:unpack -阿里云资讯网
杂项函数库:unpack
发布时间:
更新时间:
来源:网络
上传者:用户
(PHP3 , PHP4)
unpack ---&http://www.aliyun.com/zixun/aggregation/37954.html&& 从字符串取出资料
unpack (string format, string data)
unpack( )按照参数format将二进制字符串数组,传回的数组包含了取出(unpack)二进制字符串的元素。
unpack( )的运作与Perl有稍微的不同,此函数取出的资料是储存在数组之中。为达到这个,你必须要有不同的格式码名称,并且以斜线 / 将分隔开来。
&&& $array = unpack (&c2chars/nint&, $binarydata);
数组的结果将会包含&chars1&,&chars2&和 &int&。
格式码的说明请参考 : pack( )
本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:zixun-group@service.aliyun.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。
artifactory
访问http://www.jfrog.org/sites/jfrog/index.html 下载最新的zip包(内置jetty) &  下载和解压 artifactory 。目录结构如下: & &   这些目录是:     backup —— 仓库的备份,可以使用cron表达式设置备份策略,quartz定时调度程序在指定的时间里运行备份任务,备...
通过log4j可以实现将日志内容发送到其他服务器,其他机器可以再对日志做统一处理,比如发送邮件,发送短信,日志分析等等。具体demo如下: 1. 客户端代码 &&&&&&&& 客户端代码分为log4j的配置文件,和客户端记录log4j日志类 &&&&&&nbs...
&&&&&&& 原文地址:& http://java.sun.com/developer/technicalArticles/scripting/javafxpart3/ &&&&&&&& &&&&nbs...
1、新增用户admin,添加权限到wheel组 adduser admin passwd admin gpasswd -a admin wheel 参考:https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 2、更新yum源 参考:http://help.aliyun.com/k...
PostgreSQL其他
现在的环境中有十来台服务器吧,虽然不多,部署有多种数据库和应用服务器,觉有些杂乱,打算归置一下,适应以后再扩展情况。这儿转载周正中的一篇文章,备参考 原名:use pg collect and analyze OS statistics http://blog.163.com/digoal@126/blog/static/ 当你管理的...
Linux下常用的系统监控软件有Nagios、Cacti、Zabbix、Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员。 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。&&&&&& zabbix由zabbix&server与...
若您要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在5个工作日内回复。
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 php unpack h 的文章

 

随机推荐