用 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*
,因为你没有 return
ing 任何东西。
class FFT_Data{
private:
uint16_t data[16384];
public:
const uint16_t* Data() const {
return data;
}
void DataBE2LE() {
*data = ntohs(*data);
}
};
我有一个从网络设备以大端格式填充的数据数组。主机上的处理器是英特尔处理器,因此默认为小端。
我正在尝试将从网络设备(小端)接收的数据数组的内容覆盖为主机(大端)的内容,但是收到一个左值错误,指出该结构是只读的。
为简单起见,假设只有一次迭代。
我的代码如下:
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*
,因为你没有 return
ing 任何东西。
class FFT_Data{
private:
uint16_t data[16384];
public:
const uint16_t* Data() const {
return data;
}
void DataBE2LE() {
*data = ntohs(*data);
}
};