【问题标题】:Strange behavior reading DBF file in PHP using fread()使用 fread() 在 PHP 中读取 DBF 文件的奇怪行为
【发布时间】:2019-07-30 19:47:04
【问题描述】:

我创建了一个 DBF 文件,它是带有 rgdal 库的 writeOGR 函数(在 R 中)的 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,这意味着我的逻辑在前两次读取中是正确的。为什么不在下面的阅读中?

我在这里误会了什么?

【问题讨论】:

    标签: php fread dbf


    【解决方案1】:

    错误是我将 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 将每个字节打印一次并分开(在行中间难以计数/读取)。

    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
    

    想知道是否有一个选项可以打印两个两个字节(十六进制),而不颠倒它们的顺序?

    【讨论】:

    • od 似乎没有选项可以在打印多个字节时更改字节顺序。
    猜你喜欢
    • 2011-03-11
    • 2018-11-28
    • 2019-05-17
    • 2017-01-19
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多