欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

用php操作二进制文件(有二进制操作经验的人进来给偶解答一下下吧

程序员文章站 2022-05-19 20:22:14
...

二进制对于php来说是一个很偏的东西,因为php中对于二进制的支持是非常有限的,今天在一个php群组里讨论一个问题讨论了一下午也没讨论出结果来,现在总结一下,不知道我想的对不对,因为本来还觉得自己挺理解的,后来讨论多了,连二进制是什么都糊涂了. 问题:群里有

二进制对于php来说是一个很偏的东西,因为php中对于二进制的支持是非常有限的,今天在一个php群组里讨论一个问题讨论了一下午也没讨论出结果来,现在总结一下,不知道我想的对不对,因为本来还觉得自己挺理解的,后来讨论多了,连二进制是什么都糊涂了.

问题:群里有个朋友接受一个项目,以前是用java写的,里面有很多对二进制文件的操作,包括图片作为二进制存储,然后在这个二进制文件中加入一些用户输入的字符串的二进制格式,就是把图片和字符串组合到一个二进制文件中,我们卡在了怎么把字符串写入到二进制文件中的问题这里.

 1 php
 2 $header_str="abc123";
 3 
 4 function asc2bin ($temp) { 
 5   $len = strlen($temp); 
 6   for ($i=0$i$len$i++$data.=sprintf("%02x",ord(substr($temp,$i,1))); 
 7   return $data
 8 }
 9 
10 $aa = asc2bin($header_str);
11 
12 
13 $content_2=pack('H*', $aa);
14 
15 $handle = fopen ("aaaa.bin", "wb");
16 fwrite($handle, $content_2);
17 fclose($handle);
18 
19 ?>

下面是我的最终代码,它将一个abc123的字符串作为二进制流写进二进制文件 aaaa.bin中,里面用到了pack函数,这个函数可以将php的内置类型转换成二进制格式,它和unpack配套,后者可以讲二进制转换成php的内置类型.

二者的用法如下:

用php操作二进制文件(有二进制操作经验的人进来给偶解答一下下吧用php操作二进制文件(有二进制操作经验的人进来给偶解答一下下吧Code
 1 1 string pack ( string $format [, mixed $args [, mixed $用php操作二进制文件(有二进制操作经验的人进来给偶解答一下下吧]] )
 2 2 //Pack given arguments into binary string according to format.
 3 3  
 4 4 array unpack ( string $format, string $data )
 5 5 //Unpacks from a binary string into an array according to the given format.
 6 其中,$format跟perl里的pack格式类似,有如下一些(中文是我加的,有不准确的欢迎提出):
 7 a NUL-padded string,即“\0”作为“空字符”的表示形式
 8 A SPACE-padded string,空格作为“空字符”的表示形式
 9 h Hex string, low nibble first,升序位顺序
10 H Hex string, high nibble first,降序位顺序
11 c signed char,有符号单字节
12 C unsigned char,无符号单字节
13 s signed short (always 16 bit, machine byte order)
14 S unsigned short (always 16 bit, machine byte order)
15 n unsigned short (always 16 bit, big endian byte order)
16 v unsigned short (always 16 bit, little endian byte order)
17 i signed integer (machine dependent size and byte order)
18 I unsigned integer (machine dependent size and byte order)
19 l signed long (always 32 bit, machine byte order)
20 L unsigned long (always 32 bit, machine byte order)
21 N unsigned long (always 32 bit, big endian byte order)
22 V unsigned long (always 32 bit, little endian byte order)
23 float (machine dependent size and representation)
24 double (machine dependent size and representation)
25 x NUL byte,实际使用的时候作为跳过多少字节用,很有用
26 X Back up one byte,后退1字节
27 @ NUL-

上面是用法,但是在我们的讨论中遇到了问题,归根结底就是说 二进制文件有没有可能在记事本里显示成不是乱码的形式呢?群上很多人说二进制文件在记事本里查看就应该是乱码,我一开始也深信不移,所以对自己的程序也没有了信心,因为我这个二进制文件虽然在高级文本处理工具里查看,十六进制形式的确是正确的,可是在记事本中竟然不会显示乱码,而是显示"abc123",我开始想我应该搞错了,我应该把字符串直接写进二进制文件中了,而不是写的二进制流.

现在我回来想了想,突然想到二进制文件就一定是乱码了么?英文字母就是以字节编码的,一个英文字母占一字节,8位,我把一个字符串的二进制写入一个二进制文件后,在记事本中当然会显示文本啦,因为记事本自动解析二进制,然后转换成字符串的格式了,我觉得我上面的程序其实是正确的.

其实我也不敢确认,二进制文件是个很复杂的概念,不同的二进制文件有着不同的结构,对于二进制的了解太少了,群上都没有一个能说清楚二进制文件到底是什么,怎么向二进制文件写入字符串就更别提了.

这里搞.NET的人多,大家应该都对二进制有概念吧,急问高手,我这样写二进制文件对还是不对啊,不问代码,而是字符串的二进制形式写到文件后,显示的是乱码还是字符串本身啊,望高手解答.