【发布时间】:2012-12-15 06:21:28
【问题描述】:
我正在编写一个 websocket 服务器,我必须处理需要取消屏蔽的屏蔽数据。
掩码为 unsigned char[4],数据也是 unsigned char* 缓冲区。
我不想逐字节异或,我更愿意一次异或 4 个字节。
uint32_t * const end = reinterpret_cast<uint32_t *>(data_+length);
for(uint32_t *i = reinterpret_cast<uint32_t *>(data_); i != end; ++i) {
*i ^= mask_;
}
在这种情况下使用 reinterpret_cast 有什么问题吗?
替代方案是以下代码,它不那么清晰且不那么快:
uint64_t j = 0;
uint8_t *end = data_+length;
for(uint8_t *i = data_; i != end; ++i,++j) {
*i ^= mask_[j % 4];
}
我对替代方案很感兴趣,包括依赖于 c++11 功能的替代方案。
【问题讨论】:
-
“当...时 reinterpret_cast 不好” - “是的,永远不要使用它!” - 每个 C++ 人,永远。
-
好吧,如果您涉及
reinterpret_cast的代码甚至远程接近正确,我个人不会有问题。 ;-) -
作为一个即时反应,我想知道
length是否保证是sizeof(uint32_t)的倍数。否则代码有明显缺陷。 -
@H2CO3 有时您无法绕过
reinterpret_cast。在(几乎)所有情况下,C 风格的转换都是不好的。 -
另一种可能性是
data可能无法正确对齐以处理该地址处的uint32_t。在许多平台上这不是问题,但有些平台需要正确对齐数据才能访问。如果数据正确对齐,我想知道你为什么不使用更大的类型。
标签: c++ casting c++11 reinterpret-cast