10

如何从字符串/规范表示中获取 uuid 的 16 字节二进制形式:

前任:1968ec4a-2a73-11df-9aca-00012e27a270

干杯,/马辛

4

2 回答 2

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

于 2010-03-20T18:59:25.093 回答
0

如果您准确阅读了有关 DCE 定义的 UUID 的格式和字符串表示的章节,那么您不能天真地将 UUID 字符串视为十六进制字符串,请参阅UUID 的字符串表示(从Microsoft 开发人员网络中引用)。即因为前三个字段以大端表示(最高有效位在前)。

因此,在运行 PHP 32 位的小端系统上,最准确的方式(可能也是最快的方式)是:

$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.

于 2015-01-21T21:15:38.337 回答