2011-04-29 62 views
2

我有一个二进制文件,都是8位整数。我试图使用php unpack()函数,但我不能得到任何参数为1字节整数工作。我试图将数据与一个虚拟字节结合起来,以便我可以使用'n'/'v'参数。我正在使用Windows机器来做到这一点。最终,我想要一个函数返回一个基于8位二进制整数字符串的整数数组。我已经试过代码如下 -PHP - 读取8位整数

$dat_handle = "intergers.dat"; 
$dat_file = fopen($dat_handle, "rb"); 
$dat_data = fread($dat_file, 1); 
$dummy = decbin(0); 
$combined = $dummy.$dat_data; 
$result = unpack("n", $combined); 
+0

'“n”'无符号短 - 16位。当然,读取8位int将会失败,如果你将它读作16位int;)。尝试'解压缩(“c”,$合并);' – 2011-04-29 02:35:16

+1

@Frank他的想法实际上是健全的(假设无符号数据),他的执行是错误的。当他应该预先加入'chr(0)'时,他预先设置'0'。这就是说,这仍然是错误的做法! – 2011-04-29 03:01:03

+0

你是对的:decbin返回一个包含字符“0”的PHP字符串,这根本不是他想要的。 – 2011-04-29 03:09:14

回答

4

您要查找的是char数据类型。现在有两个版本,签名(小写c)和无符号(大写C)。只需使用适合您数据的那个。

<?php 
    $byte = unpack('c', $byte); 
?> 

此外,如果数据文件只是一堆字节而没有其他东西,而且您知道它的长度,那么您可以这样做。 (如果长度是16连胜签署字符)。

<?php 
    $bytes = unpack('c16', $byte); 
?> 

如果你不知道有多少字节会在文件中,但你知道有只将是字节你可以使用星号代码读取,直到EOF。

<?php 
    $bytes = unpack('c*', $byte); 
?> 
1

以下应该做你想要什么(ord):

$dat_handle = "intergers.dat"; 
$dat_file = fopen($dat_handle, "rb"); 
$dat_data = ord(fread($dat_file, 1)); 

你所要做的是检索单字节的整数值。由于您一次只能读取一个字节,因此您始终只有一个有效的ASCII字符。 ord返回该一个字符的二进制值。