C 8位输入给出了奇怪的行为,正如16/32位给出的小端数/大端数

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; }; 在同一个模块中,我向这样的成员提供了值-

我有一个像这样的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;

};
在同一个模块中,我向这样的成员提供了值-

   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

这给我带来了很多问题

  • 这和小端码/大端码有关吗

  • 如果是,8位的htonl和htons等函数的对应项是什么

  • 如果没有,可能是什么问题,或者我完全误解了什么

  • 最好的方法是什么?修改结构中这些字段的顺序
    本身还是应用一些位运算符和位移位

  • 在命令行提供的输入-

        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
    关键字的选择使得它们不可能有任何预先存在的含义),结合了位字段的优点和真正的可移植性。太糟糕了,我怀疑有人会实现这样的事情。