好的,所以我想我已经接近了,但是我对二进制数据的理解遇到了限制。
我正在解析一些作为几何类型插入的 MySQL 数据,使用 PHPunpack()
作为我的解析器,一切都很顺利,直到我开始尝试解压缩复杂的几何类型(例如MULTIPOINT
)。
对于一种POINT
数据类型,我使用一种简单地忽略第一个块然后给我一个关联数组 , 和 的解包模式取得了type
很好order
的lat
成功lon
:
$coords = unpack('x/x/x/x/corder/Ltype/dlat/dlon', $point);
// >>> [
// 'order' => 1,
// 'type' => 1,
// 'lat' => (expected value),
// 'lon' => (expected value)
// ];
自然地,将完全相同的模式应用于MULTIPOINT
几何图形并不会产生相同的效果。它得到order
andtype
变成 4,但是lat
and的值lon
根本不是我所期望的。所以,好奇地想看看整个东西是什么样子的,我改变了模式,把它全部吐出来作为“双(机器依赖的大小和表示)”类型:
$coords = unpack('x/x/x/x/corder/Ltype/d*', $multipoint);
// >>> mayhem
解包的内容实际上包括五个额外的数组项,而不是我期望的具有两个点 (2x2) 的多点的 4 个,并且这些值完全是古怪的。例如,我希望在 40-something-point-whatever 范围内的某个值看起来像是-1.0977282851114052e-218
.
打开包装的正确方法是MULTIPOINT
什么?我的直觉告诉我,我正在对不应该的字节进行切片,或者将它们转换为不合适的类型,但我不确定那些应该是什么。