PHP读取错误的数据

时间:2014-07-31 13:24:11

标签: php binaryfiles

我正在用PHP阅读二进制文件:

$File = fopen('simplefile', 'rb');
// Random stuff
fseek($File, $APosition);
for($I = 0; $I < 10; $I ++ ){
    var_dump(unpack('V', fread($File, 4)));
}
fclose($File);

然而,这并没有为该位置提供正确的输出(正如预期的那样6357101而不是4294967295 - 我已经使用十六进制编辑器进行了检查。

然而,这项工作并给出了正确的值:

$File = fopen('simplefile', 'rb');
// Random stuff
fseek($File, $APosition);
for($I = 0; $I < 10; $I ++ ){
    fseek($File, ftell($File));  // What is this line doing?
    var_dump(unpack('V', fread($File, 4)));
}
fclose($File);

然而,我并不理解fseek($File, ftell($File));绝对没有做什么?该行是做什么的,如何在没有错误的情况下读取正确的值?


该文件的这一段只有0xFF重复了几百次。

2 个答案:

答案 0 :(得分:2)

我设置了一个所有FF字节的文件,循环正确读取-1十次,即4294967295 unsigned。我无法再现你得到的价值。

您获得的值6357101对应于字节6D 00 61 00。这是用UTF-16编码的'ma'字符,虽然它也可能意味着其他东西。

我认为文件或文件的内容不是您认为的,或者您是在错误的地方阅读。

fseek($File, ftell($File));  // What is this line doing?

它什么都不做。如果它什么都不做,我只能推测文件可能在磁盘上已损坏,或者您的PHP副本已被破坏,或者您的计算机已经悄然发疯。

答案 1 :(得分:-2)

如果你不使用那条线,那就意味着你还在读循环中的前4个字节。你需要寻求。

<强> sometxtfile.txt

aaaabbbbcccc

没有那条线就像是:

这将返回aaaaaaaaaaaa

$File = fopen('sometxtfile.txt', 'rb');
echo fread($File, 4);
echo fread($File, 4);
echo fread($File, 4);

用这一行就像:

这将返回aaaabbbbcccc

$File = fopen('sometxtfile.txt', 'rb');
echo fread($File, 4);
fseek($File, ftell($File));
echo fread($File, 4);
fseek($File, ftell($File));
echo fread($File, 4);
fseek($File, ftell($File));

有关详细信息,请参阅PHP文档。