【问题标题】:How to initialise std::istringstream from const unsigned char* without cast or copy?如何在没有强制转换或复制的情况下从 const unsigned char* 初始化 std::istringstream?
【发布时间】:2011-10-08 13:32:59
【问题描述】:

我有const unsigned char *psize_t len 描述的字节序列中的二进制数据。我希望能够将此数据传递给需要 std::istream * 的函数。

我认为我应该能够做到这一点,而无需复制数据、不安全的强制转换或编写新的流类。但到目前为止,我失败了。有人可以帮忙吗?

更新

感谢大家的cmets。这似乎是一个无法回答的问题,因为std::istreamchar 一起运行,并且在某些时候转换至少需要从unsigned char 进行整数转换。

务实的做法是这样做:

std::string s(reinterpret_cast<const char*>(p), len);
std::istringstream i(s);

并将&amp;i 传递给期望std::istream * 的函数。

【问题讨论】:

  • 你有没有真正分析过代码,发现复制数据是问题所在?我怀疑如果你只是复制数据而忘记它,你会过得更好。
  • @Tom 复制的性能不是问题,但维护两个副本的内存使用可能是 - 无论如何,据我所知,复制需要强制转换。
  • unsigned char*char* 的转换不安全的原因是假设存在非2 的补码实现。在 1 的补码或符号幅度上,*(signed char*)p != (signed char)*p;,其中punsigned char*,并且引用具有最高位设置。如果您想避免这种“不安全”的重新解释,您必须在别处执行无符号签名转换。为了避免复制,我认为这意味着编写一个流,因为 AFAIK 标准库中没有任何东西可以从 unsigned char* 读取。
  • 哦,还有一点,从unsigned charchar 的转换本身有点“不安全”,因为这些实现相同 - 如果char 被签名,它们中的任何一个都不能代表@ 987654340@(假设为CHAR_BIT == 8),那么无符号值128如何转换为有符号值呢?该标准保留了转换大于CHAR_MAX implementation-defined 的值的结果。

标签: c++ strstream


【解决方案1】:

你的答案还在抄袭。

你考虑过这样的事情吗?

const unsigned char *p;
size_t len;

std::istringstream str;
str.rdbuf()->pubsetbuf(
    reinterpret_cast<char*>(const_cast<unsigned char*>(p)), len);

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2013-01-23
    • 2016-03-26
    • 2011-02-19
    • 2019-01-08
    • 2018-06-04
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多