我正在用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
重复了几百次。
答案 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文档。