当我需要一个字符串时,我可以用unsigned char*做什么?

jCu*_*uga 3 c++ string casting unsigned-char

假设我有一个unsigned char*,我们称之为:some_data

unsigned char* some_data;
Run Code Online (Sandbox Code Playgroud)

some_data中包含类似url的数据.例如:

"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd"
Run Code Online (Sandbox Code Playgroud)

我有一个函数可以获取'foo'的值,如下所示:

// looks for the value of 'foo'
bool grabFooValue(const std::string& p_string, std::string& p_foo_value)
{
    size_t start = p_string.find("Foo="), end;
    if(start == std::string::npos)
        return false;

    start += 4;
    end = p_string.find_first_of("& ", start);

    p_foo_value = p_string.substr(start, end - start);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是我需要一个字符串传递给这个函数,或者至少一个char*(可以转换为字符串没问题).

我可以通过强制转换解决这个问题:

reinterpret_cast<char *>(some_data)
Run Code Online (Sandbox Code Playgroud)

然后把它传递给函数okie-dokie

...

直到我使用valgrind并发现这可能导致细微的内存泄漏.

Conditional jump or move depends on uninitialised value(s)  __GI_strlen
Run Code Online (Sandbox Code Playgroud)

从我收集的内容来看,它与重新解释的内容有关,搞乱了表示字符串结尾的空值.因此,当c ++试图找出字符串的长度时,搞砸了.

鉴于我无法改变some_data由unsigned char*表示的事实,有没有办法使用我的grabFooValue函数而没有这些微妙的问题?

我更喜欢保留我已经拥有的值查找函数,除非有明显更好的方法来从这个(有时很大的)unsigned char*中删除foo值.

尽管unsigned char*some_data的变化很大,有时也很大,我可以假设'foo'的值在早期的某个地方,所以我的想法是尝试获得前面X个字符的char*无符号的字符*.这可能通过让我设置char*结束的位置来消除字符串长度问题.

我尝试使用strncpy和cast的组合,但到目前为止还没有骰子.有什么想法吗?

Eri*_*rik 6

您需要知道unsigned char*指向的数据的长度,因为它不是0终止的.

然后,使用例如:

std::string s((char *) some_data, (char *) some_data + len);
Run Code Online (Sandbox Code Playgroud)