2010-03-20 53 views
3

我怎样才能得到它的字符串/规范表示的UUID的16个字节的二进制形式:16字节的二进制形式

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

欢呼声, /马辛

回答

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

pack

+0

非常感谢你 – Marcin 2010-03-20 19:36:03

+1

反向转换也可能是有用的:http://stackoverflow.com/a/2839147/536308 – 2012-03-02 11:39:46

+0

请注意,如果你的二进制值必须是可互操作的,你需要注意字节顺序(字节顺序)与其他软件。不同的规范与文本字段的解释不一致;请参阅[this](http://howtowriteaprogram.blogspot.ca/2009/03/uuid-and-byte-order.html)。 – Kevin 2013-08-20 05:53:58

0

如果你读了关于准确的格式和字符串表示的章节由DCE定义的UUID,则不能将UUID字符串当作十六进制字符串,请参阅String Representation of UUIDs(参考Microsoft Developer Network)。 也就是说因为前三个字段以大端(最高有效位数字)表示。

因此,最准确的方法(可能最快)上运行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