提问人:asimes 提问时间:11/11/2023 最后编辑:Abderrahmene Rayene Mihoubasimes 更新时间:11/11/2023 访问量:96
使用 reinterpret_cast 解析模板化网络数据
Using reinterpret_cast to parse templated network data
问:
我正在研究一种通过网络发送小端数据的协议,我的机器也是小端。我不会关心大端机器。
与通过网络发送的数据分开的是指示如何解释数据的模板文件。
为了这个问题,我们只说唯一的模板指示将数据解析为 4 字节整数,紧跟 8 字节整数。
#include <cstdint>
#include <iostream>
class Int32 final {
public:
Int32(
const char* const a_buf,
const int a_offset
) :
m_buf (a_buf),
m_offset(a_offset)
{}
int32_t getVal() const { return *reinterpret_cast<const int32_t*>(m_buf + m_offset); }
private:
const char* const m_buf;
const int m_offset;
};
class Int64 final {
public:
Int64(
const char* const a_buf,
const int a_offset
) :
m_buf (a_buf),
m_offset(a_offset)
{}
int64_t getVal() const { return *reinterpret_cast<const int64_t*>(m_buf + m_offset); }
private:
const char* const m_buf;
const int m_offset;
};
int main(int argc, char** argv) {
// Make up some data for the sake of a SO example
//
// The real data is sent over a network with little endian ordering and my
// machine is also little endian
char buf[12];
*reinterpret_cast<int32_t*>(buf + 0) = 42;
*reinterpret_cast<int64_t*>(buf + 4) = 69;
// Example of "applying a template" to the data, in this case the "template"
// is just a 4 byte int followed by a 8 byte int
const Int32 foo(buf, 0);
const Int64 bar(buf, 4);
std::cout << foo.getVal() << " " << bar.getVal() << std::endl;
return 0;
}
在上面的代码中,我自己填充,在实际代码中,通过复制通过网络发送的数据来填充。buf
buf
我关心的是是否存在与这两种方法相关的任何未定义的行为。getVal
安全吗?reinterpret_cast
m_buf + m_offset
答: 暂无答案
评论
memcpy
(buf + 0) % alignof(std::uint32_t) == 0
(buf + 4) % alignof(std::uint64_t) == 0
int32_t
int64_t
memcpy
memcpy
reinterpret_cast