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

Strange behavior reading DBF file in PHP using fread()

我使用 rgdal 库的 writeOGR 函数(在 R 中)创建了一个 DBF 文件作为 shapefile 的一部分。

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

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)",这意味着正在使用 ord(fread($dbf,1)); 命令读取接近 od 输出末尾的“57”。

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

我误会了什么?

错误是我混淆了 od 命令和来自 DOS 的 debug...

od -x 打印每两个字节颠倒顺序的字节(对我来说太混乱了)。

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

od -t x1 打印每个字节一次并分开(在行中间 count/read 更难)。

0000000 03 77 07 1e 1b 00 00 00 a1 00 d1 00 00 00 00 00
0000020 00 00 00 00 00 00 00 00 00 00 00 00 00 57 00 00

想知道是否有一个选项可以在不颠倒顺序的情况下逐个打印字节(十六进制)?