【发布时间】:2017-10-23 19:31:55
【问题描述】:
我在尝试重新解释数据以从消息中提取信息时遇到了一些困难。我试图在这里重现问题。
我通过将它们从堆栈中弹出来接收一系列长整数(32 位)。我需要将它们组装成 4 个字(16 字节)的数据包。我在下面重新创建的结构类似于给定数据包的第一个单词。我遇到的困难是,为了确定哪个单词是起始数据包,以及我需要能够读取结构的 s5 成员中数据的八进制值的数据包类型。
简而言之,对于每条消息,我需要将第 16-31 位解释为 16 位整数,无论它是否跨越其他消息的位边界。
我原以为这会是一项容易得多的任务,但我似乎无法让它发挥作用。这是我尝试过的。我只是得到 Null 值。
struct S
{
uint8_t s1 :8;
short s2 :2;
bool s3 :1;
int s4 :5;
uint16_t s5 :16;
};
int main() {
S s;
s.s1 = 3;
s.s2 = 2;
s.s3 = true;
s.s4 = 1;
s.s5 = 02050;
long l;
memcpy(&l, &s, sizeof(S));
std::deque<long> d;
d.push_back(l);
cout << *((uint16_t*)(&d.front()+2)) <<endl;
【问题讨论】:
-
您正在将 'S' 大小的内容复制到 long 中?一个长的不足以容纳所有的编辑:我很抱歉,我误读了。我仍然会检查你的结构包装并确保 sizeof(S) == sizeof (long)
-
我们系统中的 long 是 32 位,也就是 4 个字节。
-
是的,抱歉我发得太快了。但是你确定 sizeof(S) == sizeof(long) 吗?
-
我确实验证了。 S 大小为 4 个字节。不过观察力不错。如果我对 s2 和 s3 使用整数,我会得到一个更大的结构,除非它被打包。
-
位域中的位布局由实现定义。这些字段甚至可能与定义的顺序不同。
标签: c++