Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在处理低级字节操作时,reinterpret_cast是否不好?_C++_Casting_C++11_Reinterpret Cast - Fatal编程技术网

C++ 在处理低级字节操作时,reinterpret_cast是否不好?

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

我正在编写一个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 ^= 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
    是否保证是
    sizeof(uint32\u t)
    的倍数。否则代码中有一个明显的缺陷。@H2CO3有时您无法绕过
    重新解释\u cast
    。在(几乎)所有情况下,C风格的强制转换都是不好的。另一个潜在问题是,
    数据
    可能无法正确对齐,无法在该地址处理
    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];