C 8位输入给出了奇怪的行为,正如16/32位给出的小端数/大端数
我有一个像这样的C结构C 8位输入给出了奇怪的行为,正如16/32位给出的小端数/大端数,c,pointers,struct,network-programming,bit-manipulation,C,Pointers,Struct,Network Programming,Bit Manipulation,我有一个像这样的C结构 struct icmp_prefixopt { u_int8_t icmpopt_type; u_int8_t icmpopt_len; u_int8_t prefixlen; u_int8_t lflag:1; u_int8_t aflag:1; u_int8_t reserved:6; }; 在同一个模块中,我向这样的成员提供了值-
struct icmp_prefixopt {
u_int8_t icmpopt_type;
u_int8_t icmpopt_len;
u_int8_t prefixlen;
u_int8_t lflag:1;
u_int8_t aflag:1;
u_int8_t reserved:6;
};
在同一个模块中,我向这样的成员提供了值-
popt= (struct icmp_prefixopt *)
malloc(sizeof(struct icmp_prefixopt));
popt->icmpopt_type = 3;
popt->icmpopt_len = 4;
popt->prefixlen = (u_int8_t)strtoul(arg, (char **)NULL, 0);
arg = index(arg, '+');
if (arg) {
++arg;
popt->lflag = ((u_int8_t)strtoul(arg, (char **)NULL, 0))&1;
}
arg = index(arg, '+');
if (arg) {
++arg;
popt->aflag = ((u_int8_t)strtoul(arg, (char **)NULL, 0))&1;
}
arg = index(arg, '+');
if (arg) {
++arg;
popt->reserved = 32; //((u_int8_t)strtoul(arg, (char **)NULL, 0))<<2;
}
但对于其组成字节中的其他3个字段,位看起来是相反的-
lflag:1; aflag:1; reserved:6
所以它应该是-10100000=A0
,但实际上它们是=>81=10000001
这给我带来了很多问题
本身还是应用一些位运算符和位移位
32+1+0+32
最后的32在这里没有任何作用,因为我已经在模块本身中固定了32以进行测试。
虽然我的实际目的也需要考虑这个领域。
请尽快帮助我找到其他方法
提前准备好
编辑:
这是我需要创建的实际结构,在创建的同时,还需要为用户通过GUI指定所有字段的值做准备。(目前仅通过linux命令行)
我想我现在已经把问题说得更清楚了,但如果需要进一步的信息,我很乐意补充 编译器选择如何打包位字段完全取决于实现。它不一定与持久性有任何关系
htnol
(及类似)不适用于位字段。如果您需要保证订单,那么您需要自己手动打包uint8\t
。例如:
struct icmp_prefixopt {
u_int8_t icmpopt_type;
u_int8_t icmpopt_len;
u_int8_t prefixlen;
u_int8_t stuff;
}
...
popt->stuff = (lflag << 7) | (aflag << 6);
struct icmp\u prefixopt{
u_int8_t icmpt_类型;
国际货币基金组织;
u__int8_t前置桥;
你喜欢的东西;
}
...
popt->stuff=(lflag编译器选择如何打包位字段完全取决于实现。它不一定与endianness有任何关系
htnol
(及类似内容)不适用于位字段。如果您需要保证订单,则需要自己手动打包uint8\t
。例如:
struct icmp_prefixopt {
u_int8_t icmpopt_type;
u_int8_t icmpopt_len;
u_int8_t prefixlen;
u_int8_t stuff;
}
...
popt->stuff = (lflag << 7) | (aflag << 6);
struct icmp\u prefixopt{
u_int8_t icmpt_类型;
国际货币基金组织;
u__int8_t前置桥;
你喜欢的东西;
}
...
popt->stuff=(lflag谢谢…因为我是初学者,所以您能否提供一些标准代码片段示例或任何相关链接,以帮助我进一步处理此类更复杂的问题…正如您使用#define
sGiven标准定义位字段行为时缺乏特异性所说的那样,我想知道其目的是什么如果一个人可以声明类似于union-SignFlag=StatusWord:7:1
,我可以看到它在内部和外部结构中都非常有用(语法和union
关键字的选择使得它们不可能有任何预先存在的含义),结合了位域的优点和真正的可移植性。太糟糕了,我怀疑任何人都不会实现这样的事情。谢谢……因为我是初学者,所以您也可以提供一些标准代码片段示例或任何相关链接,帮助我进一步处理更复杂的问题……正如您使用#define
s所说的那样考虑到标准在定义位字段行为方面缺乏特殊性,我想知道它们的用途是什么。如果可以声明类似于union-SignFlag=StatusWord:7:1
,我可以看到它在内部和外部结构中都非常有用(语法和union
关键字的选择使得它们不可能有任何预先存在的含义),结合了位字段的优点和真正的可移植性。太糟糕了,我怀疑有人会实现这样的事情。