2

我有一个函数可以执行简单的按位异或加密。它看起来像这样:

void maskData(char* data, int length)
        {
            for(int i = 0; i < length; i++)
            {
                int j = i % 4;
                cout << bitset<8>(data[i]) << endl << bitset<8>(this->maskingKey[j]) << endl;
                data[i] ^= this->maskingKey[j];
            }
        }

应用程序的输出是:

01010100
01001011

然后它就死了。我附上gdb它,发现引发了 SIGSEGV-Exception。

01010100
01001011

Program received signal SIGSEGV, Segmentation fault.
0x00000000004100ea in WebSocketLayer::WebSocketFrame::maskData (
    this=0x7fffffffe190, data=0x423621 "This is a test", length=14)
    at ../BoostTransport/WebSocketLayer.h:130
130                 data[i] ^= this->maskingKey[j];

我真的不确定为什么会发生这种情况,对我来说一切似乎都很好。

编辑:更多代码:

    void setData(char* data, int length)
    {
                this->maskData(data, length);

     // ... ...
     }

wf.setData("This is a test", strlen("This is a test"));

循环在第一次运行时直接失败,即ij为 0。

4

1 回答 1

4

我打赌data指向一个常数。您不能修改常量,这就是使它们成为常量的原因。所以任何类似的东西maskData("hello", 5);都是非法的。这也是非法的:

char *j = "This is a test";
maskData(j, strlen(j));

这里,j指向一个常数。您不能修改常量。

于 2015-12-28T20:31:57.477 回答