如何将DWORD和LPBYTE解析为std :: string

时间:2017-01-10 10:15:14

标签: c++ string active-directory

我正在编写一些代码,这些代码将使用C ++中的LDAP从Active Directory中读取。 我得到的一个结构是AD_OCTET_STRING,一个由8位字节表示的字符串。

结构如下所示:

typedef struct __MIDL___MIDL_itf_ads_0000_0000_0002
{
    DWORD dwLength;
    LPBYTE lpValue;
    ADS_OCTET_STRING;
}   

dwLength是第二个值的长度,它是一个BYTE指针。 现在我需要使用dwLength中的长度来正确解析它。

我知道basic_string有一个构造函数可以传递长度,但我没有设法让它工作。 有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

根据MSDNLPBYTE只是BYTE*

  

此类型在WinDef.h中声明如下:

     

typedef BYTE far *LPBYTE;

现在,BYTE本身只是一个无符号的char指针:

  

此类型在WinDef.h中声明如下:

     

typedef unsigned char BYTE;

所以LPBYTE实际上是unsigned char *。但是,std::string没有接受unsigned char*的构造函数,因此您需要将其强制转换为char *。了解了所有这些,您最终可以使用

构建std::string
string(reinterpret_cast<char const *>(your_struct.lpValue), your_struct.dwLength);

答案 1 :(得分:1)

std :: string可以使用任何一对迭代器进行初始化,这些迭代器的value_type可以转换为字符串的字符类型。

#include <cstdint>
#include <string>

using LPBYTE = std::uint8_t *;
using DWORD = std::uint32_t;

struct temp
{
    DWORD dwLength;
    LPBYTE lpValue;
};

std::string to_string(const temp& source)
{
  return std::string(source.lpValue, source.lpValue + source.dwLength);
}