2017-01-10 303 views
2

我正在編寫一些代碼,它將使用C++中的LDAP從Active Directory中讀取。 我得到的其中一個結構是AD_OCTET_STRING,一個由8位字節表示的字符串。如何解析DWORD和LPBYTE爲std :: string

的結構是這樣的:

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

dwLength的是第二值,這是一個字節指針的長度。 現在我需要使用dwLength中的長度來正確解析這個。

我知道basic_string有一個構造函數,你可以通過這個長度,但是我沒有設法讓它工作。 任何人都知道如何解決這個問題?

回答

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); 
} 
1

MSDNLPBYTE簡直是一個BYTE*

此類型在WINDEF.H聲明如下:

typedef BYTE far *LPBYTE;

現在,​​本身是一個簡單的無符號字符指針:

此類型在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);