16-байтовая двоичная форма канонического представления uuid в php

Как я могу получить 16-байтовую двоичную форму uuid из ее строкового / канонического представления:

например:1968ec4a-2a73-11df-9aca-00012e27a270

ура / Марцин

2 ответа

Решение
 $bin = pack("h*", str_replace('-', '', $guid));

пак

Если вы внимательно прочитали главу о формате и строковом представлении UUID, как это определено DCE, то вы не сможете наивно трактовать UUID-строку как шестнадцатеричную строку, см. Строковое представление UUID (на которое ссылается Microsoft Developer Network). Т.е. потому что первые три поля представлены в формате с прямым порядком байтов (наиболее значимая цифра первая).

Итак, самый точный (и, вероятно, самый быстрый) способ в системе с прямым порядком байтов, работающей на PHP 32bit:

$bin = call_user_func_array('pack',
                            array_merge(array('VvvCCC6'),
                                        array_map('hexdec',
                                                  array(substr($uuid, 0, 8),
                                                        substr($uuid, 9, 4), substr($uuid, 14, 4),
                                                        substr($uuid, 19, 2), substr($uuid, 21, 2))),
                                        array_map('hexdec',
                                                  str_split(substr($uuid, 24, 12), 2))));

Он разбивает строку на поля, превращает шестнадцатеричное представление в десятичные числа и затем перемещает их pack,

Поскольку у меня нет доступа к архитектуре с прямым порядком байтов, я не смог проверить, работает ли это, или нужно использовать, например, разные спецификаторы формата для pack,

Другие вопросы по тегам