16 Bytes Formulário binário de representação canônica UUID em PHP

StackOverflow https://stackoverflow.com/questions/2484267

  •  21-09-2019
  •  | 
  •  

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

Foi útil?

Solução

 $bin = pack("h*", str_replace('-', '', $guid));

pacote

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top