c++如何解析LDAP目录服务中的数据项编码格式【深度】

风辰同学_7662

风辰同学_7662

2026-04-08

394人浏览

原创

LDAP数据项的BER编码本质是TLV(Tag-Length-Value)二进制序列化格式,非人类可读;libldap提供ldap_get_values_len等API安全解析,避免手动处理BER细节导致的崩溃或乱码。

c++如何解析ldap目录服务中的数据项编码格式【深度】

LDAP数据项的BER编码本质是什么

LDAP协议底层用BER(Basic Encoding Rules)序列化所有数据,不是JSON或XML那种人类可读格式。你看到的ldap_search_s返回的LDAPMessage*里,属性值(struct berval**)是原始字节流,没有自动解码——C++标准库完全不感知BER,必须靠libldap或手动解析。

常见误判是把berval->bv_val当UTF-8字符串直接std::string构造,结果遇到二进制值(如userCertificate、objectSid)就崩溃或乱码。

用libldap自带API安全提取属性值

别自己写BER解析器。OpenLDAP的libldap提供ldap_get_values_len和ldap_get_values_len_ber,它们已处理了TLV(Tag-Length-Value)结构、长度字段的多字节变长编码、嵌套结构等细节。

  • ldap_get_values_len返回struct berval**数组,每个berval含bv_val(原始指针)和bv_len(真实字节数),必须用ber_bvecfree释放
  • 对jpegPhoto这类二进制属性,直接用bv_val和bv_len写入文件或传给OpenSSL;对cn这种文本属性,确认bv_len非零后再用std::string(reinterpret_cast(bv->bv_val), bv->bv_len)
  • 避免用ldap_get_values——它强行以\0截断,会丢数据

识别并处理常见LDAP属性的编码特殊性

不同属性类型隐含不同编码规则,LDAP协议本身不强制校验,全靠客户端约定:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • objectSid:Windows AD特有,BER编码为OCTET STRING,但实际是二进制SID结构(包含4字节revision、2字节subauth count、8字节authority、多个4字节subauth)。需用ConvertStringSidToSid(Windows)或手动解析bv_val字节布局
  • userCertificate:DER编码的X.509证书,可直接喂给openssl x509 -inform DER -in cert.der -text验证;C++中用OpenSSL的d2i_X509函数解析
  • unicodePwd:AD要求UTF-16LE编码且前后加双引号,BER封装后仍是OCTET STRING,不能当UTF-8处理
  • pwdLastSet:Windows FILETIME(64位整数,100纳秒精度),需转换为Unix时间戳:减去116444736000000000LL再除以10000000

手动解析BER时绕不开的三个坑

真要自己解析BER(比如做协议调试或轻量级客户端),以下细节不处理就会读错长度或跳过数据:

  • 长度字段可能占1–127字节:0x80开头表示后续N字节是长度值,需按大端解析;0x7F以内是短格式,长度即字节值本身
  • 标签类型分universal(0x00–0x1F)、application(0x40–0x5F)、context-specific(0x80–0xBF),LDAP常用0x04(OCTET STRING)、0x01(BOOLEAN)、0x02(INTEGER)——但libldap返回的berval已剥离标签头,只留value部分
  • 字符串类标签(如0x1E UTF8String)在LDAP中极少用,绝大多数文本属性仍用0x04 OCTET STRING,语义由属性语法(schema)定义,而非BER标签

真正麻烦的是嵌套结构:LDAP搜索响应里的SearchResultEntry是SEQUENCE,内部又含SEQUENCE of Attribute,每层都需递归解析TLV。除非必要,别碰这个层级。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2275

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3702

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1236

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4279

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7239

3

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2023.11.13

2150

6

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.30

163

8

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3728

5

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

5004

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习