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

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

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

ура, / Marcin

Ответы [ 2 ]

13 голосов
/ 20 марта 2010
 $bin = pack("h*", str_replace('-', '', $guid));

пакет

0 голосов
/ 22 января 2015

Если вы внимательно прочитали главу о формате и строковом представлении 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.

...