C++ 在处理低级字节操作时,reinterpret_cast是否不好?
我正在编写一个websocket服务器,我必须处理需要解密的屏蔽数据 掩码是无符号字符[4],数据也是无符号字符*缓冲区 我不想一个字节一个字节地异或,我宁愿一次异或4个字节C++ 在处理低级字节操作时,reinterpret_cast是否不好?,c++,casting,c++11,reinterpret-cast,C++,Casting,C++11,Reinterpret Cast,我正在编写一个websocket服务器,我必须处理需要解密的屏蔽数据 掩码是无符号字符[4],数据也是无符号字符*缓冲区 我不想一个字节一个字节地异或,我宁愿一次异或4个字节 uint32_t * const end = reinterpret_cast<uint32_t *>(data_+length); for(uint32_t *i = reinterpret_cast<uint32_t *>(data_); i != end; ++i) { *i ^= m
uint32_t * const end = reinterpret_cast<uint32_t *>(data_+length);
for(uint32_t *i = reinterpret_cast<uint32_t *>(data_); i != end; ++i) {
*i ^= mask_;
}
我一直在寻找替代方案,包括依赖于c++11功能的方案。在这种情况下,
reinterpret\u cast
没有什么特别的问题。但是,要小心
目前的32位循环是不正确的,因为它不适合有效负载不是32位的倍数的情况。我想有两种可能的解决办法:
- 更换
=代码>与
发布的方法存在一些潜在问题:
- 在某些系统上,大于char的类型的对象需要正确对齐才能访问。
的一个典型要求是对象与可被四整除的地址对齐uint32\t
- 如果
循环可能永远不会终止length/sizeof(uint32\u t)!=0
- 根据系统的端性,
如果解决了这些问题,
需要包含不同的值。如果掩码
是由合适数组的mask
生成的,则不应为数组*重新解释(char\u mask)
可以在您遇到的情况下使用。重新解释指针的含义是存在此操作的原因之一,有时需要此操作。我将创建一个合适的测试用例来验证它是否正常工作,以避免在将代码移植到其他平台时发现问题 就我个人而言,我会采用一种不同的方法,直到分析显示速度太慢:reinterpret\u cast(…)
char* it(data); if (4 < length) { for (char* end(data + length - 4); it < end; it += 4) { it[0] ^= mask_[0]; it[1] ^= mask_[1]; it[2] ^= mask_[2]; it[3] ^= mask_[3]; } } it != data + length && *it++ ^= mask_[0]; it != data + length && *it++ ^= mask_[1]; it != data + length && *it++ ^= mask_[2]; it != data + length && *it++ ^= mask_[3];
char*it(数据); 如果(4<长度){ for(char*end(数据+长度-4);it
我在软件中肯定使用了一些类似的方法,它们的意思是更快,而且没有发现它们是一个显著的性能问题。
是“当……”“是的,永远不要使用它”时的重释。“-每一个C++的家伙,永远。如果你的代码涉及到代码> RealTytRease甚至是远程接近正确的,我个人不会有任何问题。;-)作为一种即时反应,我想知道
是否保证是length
的倍数。否则代码中有一个明显的缺陷。@H2CO3有时您无法绕过sizeof(uint32\u t)
。在(几乎)所有情况下,C风格的强制转换都是不好的。另一个潜在问题是,重新解释\u cast
可能无法正确对齐,无法在该地址处理数据
。这在许多平台上都不是问题,但在某些平台上,数据需要正确对齐才能访问。如果数据正确对齐,我想知道为什么不使用更大的类型。uint32\t
for(int i=0;i<n;++i) payload[i]^=key[i&3];
char* it(data); if (4 < length) { for (char* end(data + length - 4); it < end; it += 4) { it[0] ^= mask_[0]; it[1] ^= mask_[1]; it[2] ^= mask_[2]; it[3] ^= mask_[3]; } } it != data + length && *it++ ^= mask_[0]; it != data + length && *it++ ^= mask_[1]; it != data + length && *it++ ^= mask_[2]; it != data + length && *it++ ^= mask_[3];
- 在某些系统上,大于char的类型的对象需要正确对齐才能访问。