3

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

unsigned char* some_data;

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

"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd"

我有一个函数可以获取 '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;
}

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

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

reinterpret_cast<char *>(some_data)

然后将其传递给函数 all okie-dokie

...

直到我使用 valgrind 并发现这会导致微妙的内存泄漏。

Conditional jump or move depends on uninitialised value(s)  __GI_strlen

从我收集到的信息来看,这与重新解释转换弄乱了指示字符串结尾的空值有关。因此,当 c++ 试图找出字符串的长度时,事情就会变得很棘手。

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

我宁愿保留我已经拥有的价值发现功能,除非显然有更好的方法可以将 foo 值从这个(有时很大)unsigned char* 中提取出来。

尽管 unsigned char* some_data 的大小不同,有时甚至很大,但我可以假设 'foo' 的值会在早期某个地方,所以我的想法是尝试获取第一个 X 字符的 char*无符号的字符*。通过让我设置 char* 结束的位置,这可能会消除字符串长度问题。

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

4

1 回答 1

6

您需要知道 unsigned char * 指向的数据的长度,因为它不是以 0 结尾的。

然后,使用例如:

std::string s((char *) some_data, (char *) some_data + len);
于 2011-02-18T23:52:22.310 回答