PHP解决LDAP中objectGUID乱码的问题

1 篇文章 0 订阅

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位)的二进制数据:

字节描述字节序
324数据1原生
162数据2原生
162数据3原生
328数据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 表示第二段数据解析为两个,索引值分别为b1b2
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值