在PHP中,规范的UUID表示形式的16字节二进制形式是什么?

10

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

例如:1968ec4a-2a73-11df-9aca-00012e27a270

谢谢, /Marcin

2个回答

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

pack


3
反向转换也可能很有用:https://dev59.com/onE85IYBdhLWcg3wUBuz#2839147 - ıɾuǝʞ
请注意,如果您的二进制值需要与其他软件进行互操作,则需要小心字节顺序(字节序)。不同的规范在解释文本字段方面并不一致;请参见此处:http://howtowriteaprogram.blogspot.ca/2009/03/uuid-and-byte-order.html。 - Kevin

2
如果您准确阅读了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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接