【问题标题】:What can I do with an unsigned char* when I needed a string?当我需要一个字符串时,我可以用 unsigned char* 做什么?
【发布时间】:2011-02-18 23:50:01
【问题描述】:

假设我有一个 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 函数?

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

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

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

【问题讨论】:

  • reinterpret_cast&lt;&gt;() 对字符串管理没有任何作用。它所做的只是改变类型而不改变底层位。这与static_cast&lt;&gt;() 形成对比,后者会更改类型并可能修改位,因此转换将是有意义的(例如intdouble)。
  • 看起来像是来自 val-grind 的误报。

标签: c++ string casting unsigned-char


【解决方案1】:

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

然后,使用例如:

std::string s((char *) some_data, (char *) some_data + len);

【讨论】:

  • 谁说它不是空终止的?
  • 他的错误信息,表明 strlen 调用(可能来自 std::string 实现)依赖于未初始化的数据。如果这个错误来来去去取决于他是否转换为 char * 并转换为 std::string,我似乎很清楚数据不能以 0 结尾
  • @Oli:这是 valgrind 检测到问题的最可能的解释。
  • 如果你取一个带有一些文本的 unsigned char* 并计算它,然后尝试 reinterpret_cast-ing 将它转换为 char* 并再次 cout-ing 它,强制转换的字符串将有一堆垃圾在最后打印出来,所以对我来说,这似乎表明空字符从铸造中弄乱了。
  • @jCuga 肯定是另一个问题导致了这种情况,因为从 unsigned char * 到 char* 的 reinterpret_casting 不应该对空终止字节产生任何影响。从技术上讲,该行为是未指定的,但这将是非常令人惊讶的。寻找根本原因并加以解决。
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多