gpt4 book ai didi

c++ - UNICODE_STRING 到 wchar_t* null 终止

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:35 25 4
gpt4 key购买 nike

我想使用 UNICODE_STRING 中的缓冲区,但似乎我不能通过复制引用直接使用它,因为有时我可以看到字符串中间有空字节,并且 Length 比我在调试器中看到的要大。所以如果我这样做

UNICODE_STRING testStr;
//after being used by some function it has data like this 'bad丣\0more_stuff\0'

wchar_t * wStr = testStr.Buffer;

我将以 wStr = "bad丁"; 结束有没有办法将其转换为空终止的有效 wchar_t*

最佳答案

wchar_t* 只是一个指针。除非您告诉调试器(或您将 wchar_t* 传递给的任何函数)到底有多少 wchar_t 字符实际指向,否则它必须在某处停止,所以它停止在它遇到的第一个空字符上。

UNICODE_STRING::Buffer 不保证以 null 终止,但它可以包含嵌入的 null。您必须使用 UNICODE_STRING::Length 字段来了解 Buffer 中有多少 WCHAR 元素,包括嵌入的空值但不计算尾随空终止符(如果存在)。如果您需要空终止符,请将 Buffer 数据复制到您自己的缓冲区并附加一个终止符。

最简单的方法是使用std::wstring,例如:

#include <string>

UNICODE_STRING testStr;
// fill testStr as needed...

std::wstring wStrBuf(testStr.Buffer, testStr.Length / sizeof(WCHAR));
const wchar_t *wStr = wStrBuf.c_str();

嵌入的空值仍将存在,但 c_str() 将为您附加尾随的空值终止符。 调试器 仍将只显示第一个 null 之前的数据,除非您告诉调试器数据中 WCHAR 元素的实际数量。

或者,如果您知道 Buffer 数据包含多个由空值分隔的子字符串,您可以选择将 Buffer 数据拆分为字符串数组,例如:

#include <string>
#include <vector>

UNICODE_STRING testStr;
// fill testStr as needed...

std::vector<std::wstring> wStrArr;

std::wstring wStr(testStr.Buffer, testStr.Length / sizeof(WCHAR));
std::wstring::size_type startidx = 0;
do
{
std::wstring::size_type idx = wStr.find(L'\0', startidx);
if (idx == std::wstring::npos)
{
if (startidx < wStr.size())
{
if (startidx > 0)
wStrArr.push_back(wStr.substr(startidx));
else
wStrArr.push_back(wStr);
}
break;
}
wStrArr.push_back(wStr.substr(startidx, idx-startidx));
startidx = idx + 1;
}
while (true);

// use wStrArr as needed...

或者:

#include <vector>
#include <algorithm>

UNICODE_STRING testStr;
// fill testStr as needed...

std::vector<std::wstring> wStrArr;

WCHAR *pStart = testStr.Buffer;
WCHAR *pEnd = pStart + (testStr.Length / sizeof(WCHAR));

do
{
WCHAR *pFound = std::find(pStart, pEnd, L'\0');
if (pFound == pEnd)
{
if (pStart < pEnd)
wStrArr.push_back(std::wstring(pStart, pEnd-pStart));
break;
}
wStrArr.push_back(std::wstring(pStart, pFound-pStart));
pStart = pFound + 1;
}
while (true);

// use wStrArr as needed...

关于c++ - UNICODE_STRING 到 wchar_t* null 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38343022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com