本文主要是介绍PHP解决LDAP中objectGUID乱码的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PHP 中正确处理 objectGUID 的方式:
function GUIDtoStr($binary_guid) {$unpacked = unpack('Va/v2b/n2c/Nd', $binary_guid);return sprintf('%08X-%04X-%04X-%04X-%04X%08X', $unpacked['a'], $unpacked['b1'], $unpacked['b2'], $unpacked['c1'], $unpacked['c2'], $unpacked['d']);
}
函数 unpack ( string $format , string $data [, int $offset = 0 ] ) : array
作用:从二进制字符串中解压数据。
第一个参数 $format
,指定解包时使用的格式。详细请查阅 手册
第二个参数 $data
,待解包的二进制数据
GUID 本质上是一个16字节(128位)的二进制数据:
位 | 字节 | 描述 | 字节序 |
---|---|---|---|
32 | 4 | 数据1 | 原生 |
16 | 2 | 数据2 | 原生 |
16 | 2 | 数据3 | 原生 |
32 | 8 | 数据4 | 大端序 |
其通常会写成 十六进制 的字符串,如:3F2504E0-4F89-11D3-9A0C-0305E82C3301
按照该规则,对 $format
进行选用:
V:无符号长整型(32位,小端字节序)
v:无符号短整型(16位,小端字节序)
n:无符号短整型(16位,大端字节序)
N:无符号长整型(32位,大端字节序)
$unpacked = unpack('Va/v2b/n2c/Nd', $binary_guid);
V 后的 a 是 unpack 返回结果中的索引值,
v2b 表示第二段数据解析为两个,索引值分别为b1
,b2
,
n2c,Nd 也是一样的
$unpacked = ["a" => 1059390688"b1" => 20361"b2" => 4563"c1" => 39436"c2" => 773"d" => 3895210753
]
对解包后数据进行格式化:
$guid = sprintf('%08X-%04X-%04X-%04X-%04X%08X',
$unpacked['a'], $unpacked['b1'], $unpacked['b2'], $unpacked['c1'], $unpacked['c2'], $unpacked['d'];
%08X
将 $unpacked['a']
转为 8位的十六进制,长度不够时,前面补零。
如:773
转为十六进制为 305
,%04X
则格式化为 0305
这篇关于PHP解决LDAP中objectGUID乱码的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!