用 ntohs() 覆盖 uint16_t 数组的只读内容

Overwrite read-only contents of uint16_t array with ntohs()

我有一个从网络设备以大端格式填充的数据数组。主机上的处理器是英特尔处理器,因此默认为小端。

我正在尝试将从网络设备(小端)接收的数据数组的内容覆盖为主机(大端)的内容,但是收到一个左值错误,指出该结构是只读的。

为简单起见,假设只有一次迭代。

我的代码如下:

class FFT_Data{
    private:
    uint16_t data[16384];

    public:
        const uint16_t* Data (void) const {
            return (const uint16_t*)data;
        }

        const void* DataBE2LE(void) const {       // conversion function
            // (const uint16_t*)ntohs(*data);     // originally i thought this was right
            data = (const uint16_t*)ntohs(*data);
        }
}

然后这个简化的主要内容:

int main()
{
    FFT_Data fft;
    
    // data is received from network device

    fft.DataBE2LE();    // want to convert data array from BE to LE just once

    SomeFunctionThatDoesStuffWithData(fft.Data()); // function that then processes BE data.

    return 0;
}

所以在上面,我最初的想法是只执行 (const uint16_t*)ntohs(*data) 的单行函数就足以修改数据数组,因为我正在对指针进行操作,但是我不认为没错 ntohs returns a uint16_t.

然后尝试用 data = (const uint16_t*)ntohs(*data); 覆盖数据的内容失败,因为数据是私有变量,因此只读:

编译错误:FFT_Data::data' in read-only structure

DataBE2LE() 在其声明的末尾标记为 const,因此它的 this 指针是指向 const FFT_Data 对象的指针,因此它的数据成员隐式 const 且无法修改。

由于DataBE2LE()要修改data的内容,只需将DataBE2LE()末尾的const限定符去掉即可。

另外,DataBE2LE() 的 return 类型应该是 void,而不是 (const) void*,因为你没有 returning 任何东西。

class FFT_Data{
    private:
        uint16_t data[16384];

    public:
        const uint16_t* Data() const {
            return data;
        }

        void DataBE2LE() {
            *data = ntohs(*data);
        }
};