二進(jìn)制對于php來說是一個很偏的東西,因?yàn)閜hp中對于二進(jìn)制的支持是非常有限的,今天在一個php群組里討論一個問題討論了一下午也沒討論出結(jié)果來,現(xiàn)在總結(jié)一下,不知道我想的對不對,因?yàn)楸緛磉€覺得自己挺理解的,后來討論多了,連二進(jìn)制是什么都糊涂了.
問題:群里有個朋友接受一個項(xiàng)目,以前是用java寫的,里面有很多對二進(jìn)制文件的操作,包括圖片作為二進(jìn)制存儲,然后在這個二進(jìn)制文件中加入一些用戶輸入的字符串的二進(jìn)制格式,就是把圖片和字符串組合到一個二進(jìn)制文件中,我們卡在了怎么把字符串寫入到二進(jìn)制文件中的問題這里.
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的字符串作為二進(jìn)制流寫進(jìn)二進(jìn)制文件 aaaa.bin中,里面用到了pack函數(shù),這個函數(shù)可以將php的內(nèi)置類型轉(zhuǎn)換成二進(jìn)制格式,它和unpack配套,后者可以講二進(jìn)制轉(zhuǎn)換成php的內(nèi)置類型.
二者的用法如下:

Code
1 1 string pack ( string $format [, mixed $args [, mixed $
]] )
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格式類似,有如下一些(中文是我加的,有不準(zhǔn)確的歡迎提出):
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,有符號單字節(jié)
12 C unsigned char,無符號單字節(jié)
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 f float (machine dependent size and representation)
24 d double (machine dependent size and representation)
25 x NUL byte,實(shí)際使用的時候作為跳過多少字節(jié)用,很有用
26 X Back up one byte,后退1字節(jié)
27 @ NUL-
上面是用法,但是在我們的討論中遇到了問題,歸根結(jié)底就是說 二進(jìn)制文件有沒有可能在記事本里顯示成不是亂碼的形式呢?群上很多人說二進(jìn)制文件在記事本里查看就應(yīng)該是亂碼,我一開始也深信不移,所以對自己的程序也沒有了信心,因?yàn)槲疫@個二進(jìn)制文件雖然在高級文本處理工具里查看,十六進(jìn)制形式的確是正確的,可是在記事本中竟然不會顯示亂碼,而是顯示"abc123",我開始想我應(yīng)該搞錯了,我應(yīng)該把字符串直接寫進(jìn)二進(jìn)制文件中了,而不是寫的二進(jìn)制流.
現(xiàn)在我回來想了想,突然想到二進(jìn)制文件就一定是亂碼了么?英文字母就是以字節(jié)編碼的,一個英文字母占一字節(jié),8位,我把一個字符串的二進(jìn)制寫入一個二進(jìn)制文件后,在記事本中當(dāng)然會顯示文本啦,因?yàn)橛浭卤咀詣咏馕龆M(jìn)制,然后轉(zhuǎn)換成字符串的格式了,我覺得我上面的程序其實(shí)是正確的.
其實(shí)我也不敢確認(rèn),二進(jìn)制文件是個很復(fù)雜的概念,不同的二進(jìn)制文件有著不同的結(jié)構(gòu),對于二進(jìn)制的了解太少了,群上都沒有一個能說清楚二進(jìn)制文件到底是什么,怎么向二進(jìn)制文件寫入字符串就更別提了.
這里搞.NET的人多,大家應(yīng)該都對二進(jìn)制有概念吧,急問高手,我這樣寫二進(jìn)制文件對還是不對啊,不問代碼,而是字符串的二進(jìn)制形式寫到文件后,顯示的是亂碼還是字符串本身啊,望高手解答.