【发布时间】:2010-12-24 20:34:29
【问题描述】:
我正在尝试将数据流转换为结构,因为数据流由固定宽度的消息组成,并且每条消息也具有完整定义的固定宽度字段。我计划创建一个结构,然后使用 reinterpret_cast 将指向数据流的指针转换为结构以获取字段。我做了一些测试代码并得到了奇怪的结果。任何人都可以解释为什么我得到这些或如何更正代码。 (数据流将是二进制和字母数字混合的,但我只是用字符串测试)
#pragma pack(push,1)
struct Header
{
char msgType[1];
char filler[1];
char third[1];
char fourth[1];
};
#pragma pack(pop)
int main(void)
{
cout << sizeof(Header) << endl;
char* data = "four";
Header* header = reinterpret_cast<Header*>(data);
cout << header->msgType << endl;
cout << header ->filler << endl;
cout << header->third << endl;
cout << header->fourth << endl;
return 0;
}
即将出现的结果是
4
four
our
ur
r
我认为四个,our 和 ur 正在打印,因为它找不到空终止符。如何解决空终止符问题?
【问题讨论】:
-
请注意编译器可以在结构的字段之间添加空格。这意味着 memcpy 和 fread 可能无法按预期工作。最安全的过程是将数据分别复制到成员中。使用这种技术,您可以将额外的字符添加到空终止符的字符数组中,或者更好的是,将字符数组替换为 std::string。
标签: c++ pragma reinterpret-cast