2010-03-20 52 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