Хорошо, я думаю, что я близок к этому, но у меня есть ограничение в моем понимании двоичных данных.
Я анализирую некоторые данные MySQL, вставленные как геометрические типы, используя PHP unpack()
как мой синтаксический анализатор, и все шло гладко, пока я не начал пытаться распаковывать сложные типы геометрии (например, 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
, а type
становится 4, но значения lat
и lon
совсем не такие, как я ожидал.Итак, любопытно посмотреть, как все это выглядело, я изменил шаблон, чтобы просто изобразить все это как «двойные (размер и представление, зависящие от машины)»:
$coords = unpack('x/x/x/x/corder/Ltype/d*', $multipoint);
// >>> mayhem
Что включает в себя распаковка пять дополнительных элементов массива вместо 4, которые я ожидал бы для многоточечной с двумя точками (2x2), и значения были совершенно ненормальными.Например, значение, которое я ожидаю, должно быть где-то в диапазоне 40 с чем-то - независимо от того, что, кажется, читается что-то вроде -1.0977282851114052e-218
.
Как правильно распаковать MULTIPOINT
? Мой инстинкт говорит, что я нарезаю байты там, где я не должен или приводю их к неподходящему типу, но я не уверен, какими они должны быть.