2011-02-18 34 views
3

假设我有一个无符号的char *,我们称之为:some_data当我需要一个字符串时,我能用一个无符号字符*做什么?

unsigned char* some_data; 

而且some_data它具有URL的数据等。例如:

"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd" 

我有可以抓住“富”的值,如下所示的函数:

// 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) 

然后将它传递给函数的所有okie-道基

...

直到我使用的valgrind,并发现此会导致细微的内存泄漏。

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

从我收集的,它与重释铸造搞乱了null,表示字符串的结尾做。因此,当C++试图找出字符串事物的长度变得棘手时。

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

我宁愿保持我已经拥有了价值发现功能,除非明确有一个更好的方式来撕裂foo的价值了这一点(有时大)的无符号的char *的。

尽管无符号char * some_data的变化,有时还是很大的尺寸,我可以假设'foo'的值会在某个地方早,所以我的想法是尝试获取第一个char * X的无符号字符*。这可以通过让我设置char *结束的位置来消除字符串长度问题。

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

+1

`的reinterpret_cast <>()`不执行任何相对于字符串管理。它所做的只是更改类型而不更改基础位。这是在与constrast`的static_cast <>()`,这会改变类型,并且可以修改位以转换将是有意义的(例如`int`到`double`)。 – 2011-02-18 23:55:05

+0

看起来像val-grind的误报。 – 2011-02-19 00:11:16

回答

6

你需要知道你的数据无符号字符*点的长度,因为它不是0终结。

然后,使用e.g:

std::string s((char *) some_data, (char *) some_data + len); 
相关问题