【发布时间】:2011-10-08 13:32:59
【问题描述】:
我有const unsigned char *p 和size_t len 描述的字节序列中的二进制数据。我希望能够将此数据传递给需要 std::istream * 的函数。
我认为我应该能够做到这一点,而无需复制数据、不安全的强制转换或编写新的流类。但到目前为止,我失败了。有人可以帮忙吗?
更新
感谢大家的cmets。这似乎是一个无法回答的问题,因为std::istream 与char 一起运行,并且在某些时候转换至少需要从unsigned char 进行整数转换。
务实的做法是这样做:
std::string s(reinterpret_cast<const char*>(p), len);
std::istringstream i(s);
并将&i 传递给期望std::istream * 的函数。
【问题讨论】:
-
你有没有真正分析过代码,发现复制数据是问题所在?我怀疑如果你只是复制数据而忘记它,你会过得更好。
-
@Tom 复制的性能不是问题,但维护两个副本的内存使用可能是 - 无论如何,据我所知,复制需要强制转换。
-
从
unsigned char*到char*的转换不安全的原因是假设存在非2 的补码实现。在 1 的补码或符号幅度上,*(signed char*)p != (signed char)*p;,其中p是unsigned char*,并且引用具有最高位设置。如果您想避免这种“不安全”的重新解释,您必须在别处执行无符号签名转换。为了避免复制,我认为这意味着编写一个流,因为 AFAIK 标准库中没有任何东西可以从unsigned char*读取。 -
哦,还有一点,从
unsigned char到char的转换本身有点“不安全”,因为这些实现相同 - 如果char被签名,它们中的任何一个都不能代表@ 987654340@(假设为CHAR_BIT == 8),那么无符号值128如何转换为有符号值呢?该标准保留了转换大于CHAR_MAXimplementation-defined 的值的结果。