1

我有这样的结构

typedef struct {
int32_t  DataLen;
char     Data[1];
} MTEMSG;

因此Data包含DataLen应按某些规则解码的符号。我应该写ReadInt ReadString等方法。

作为第一步,我想写ReadInt. 从文档来看,这是“x86 CPU 格式的四个字节(小端字节在前)。” 我怎样才能转换char[1]int?我想它应该是这样的:

MTEMSG* data;
int offset;
....
int Reader::ReadInt()
{
int result = // read 4 bytes starting from offset
offset += 4;
}

允许使用boostand c++11。只是寻找简单快速的转换方法。

我希望一旦你建议我如何转换int,我可以自己做很多其他的方法。

4

2 回答 2

2

完全非法和 UB,但你会做类似*reinterpret_cast<int*>(data+offset).

注意对齐和东西。

于 2013-09-18T09:49:55.757 回答
0

首先,正如他们在评论中所说,在 C++ 中,这是非法的。尽管如此,假设你的编译器假设你可能会做这样的事情并且有一个明确定义的行为,那么让我们继续吧。

所以在语义上,你有这样一个结构:

typedef struct {
    int32_t  DataLen;
    char     Data[N];
} MTEMSG;

N“足够大”在哪里。

并且您需要转换Data为 4 字节的小端整数。这很简单:

MTEMSG* data;
int offset = 0;
....
int Reader::ReadInt()
{
    /* Note: int32_t would be more precise */
    int result = data->Data[offset + 0]
              | (data->Data[offset + 1] << 8)
              | (data->Data[offset + 2] << 16)
              | (data->Data[offset + 3] << 24);
    offset += 4;
}
于 2013-09-18T09:58:17.047 回答