16-байтовая двоичная форма канонического представления uuid в php
Как я могу получить 16-байтовую двоичную форму uuid из ее строкового / канонического представления:
например:1968ec4a-2a73-11df-9aca-00012e27a270
ура / Марцин
2 ответа
Если вы внимательно прочитали главу о формате и строковом представлении 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
,