16 Bytes Formulário binário de representação canônica UUID em PHP
Pergunta
Como posso obter 16 bytes Binária da forma do UUID de sua representação de cordas/canônicas:
ex:1968ec4a-2a73-11df-9aca-00012e27a270
Saúde, /Marcin
Solução
$bin = pack("h*", str_replace('-', '', $guid));
Outras dicas
Se você ler com precisão o capítulo sobre o formato e a representação de string de um uuid, conforme definido pelo DCE, você não pode tratar ingenuamente a string uuid como uma string hexadecimal, veja Representação de string de uuids (que é referenciado do Rede de desenvolvedores da Microsoft). Ou seja, porque os três primeiros campos são representados em Big Endian (mais significativo dígito primeiro).
Portanto, a maneira mais precisa (e provavelmente a mais rápida) em um pequeno sistema Endian executando o 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))));
Ele divide a corda em campos, transforma a representação hexadecimal em números decimais e depois as engaja através pack
.
Como não tenho acesso a uma grande arquitetura endiana, não pude verificar se isso funciona ou um precisa usar especificadores de formato diferentes para pack
.