使用 fread() 在 PHP 中读取 DBF 文件的奇怪行为

我有一个 DBF 文件,它是作为带有rgdal库writeOGR函数(在 R 中)的 shapefile 的一部分创建的。


当我要求使用 Linuxod命令查看它的第一个字节时,我得到以下信息。


od -x -c -N 32 BRA.dbf

0000000 7703 1e07 001b 0000 00a1 00d1 0000 0000

0000020 0000 0000 0000 0000 0000 0000 5700 0000

0000040

我的 PHP 代码是这样的。


$dbf = fopen('BRA.dbf','rb');

fread($dbf,10); // jumps over the first 10 bytes

$dbfRecSize = unpack('v',fread($dbf,2))[1]; // 'v' = little endian 16 bits: 00d1 = d1(16) = 209

fread($dbf,17); // jumps over a few more bytes

$dbfLangID = ord(fread($dbf,1)); // language driver ID

if ($dbfLangID == 0x57) {

    echo "Language: 0x57 (ISO-8859-1)\n";

} else {

    echo "Language: $dbfLangID;\n";

}

上面的代码输出“Language: 0x57 (ISO-8859-1)”,这意味着接近od输出末尾的“57”正在被ord(fread($dbf,1));命令读取。


奇怪的是,我从文件中读取了 10+2+17 = 29 个字节,所以下一个字节应该是“00”,还是不是(在 0x57 之后)?$dbfRecSize是 209,这意味着我的逻辑在前两次读取中是正确的。为什么不在下面的阅读中?


我在这里误解了什么?


Smart猫小萌
浏览 165回答 1
1回答

婷婷同学_

错误是我混淆od了debug来自 DOS 的命令...od -x 以每两个字节反转的顺序打印字节(对我来说太混乱了)。0000000 7703 1e07 001b 0000 00a1 00d1 0000 00000000020 0000 0000 0000 0000 0000 0000 5700 0000od -t x1 将每个字节打印一次并分开(在行中间更难计数/读取)。0000000 03 77 07 1e 1b 00 00 00 a1 00 d1 00 00 00 00 000000020 00 00 00 00 00 00 00 00 00 00 00 00 00 57 00 00想知道是否有一个选项可以两个两个地打印字节(十六进制),而不颠倒它们的顺序?
打开App,查看更多内容
随时随地看视频慕课网APP