Is there a portable alternative to C++ bitfields

前端 未结 5 1331
梦谈多话
梦谈多话 2021-02-05 06:53

There are many situations (especially in low-level programming), where the binary layout of the data is important. For example: hardware/driver manipulation, network protocols,

5条回答
  •  心在旅途
    2021-02-05 07:32

    We have this in production code where we had to port MIPS code to x86-64

    https://codereview.stackexchange.com/questions/54342/template-for-endianness-free-code-data-always-packed-as-big-endian

    Works well for us.

    It's basically a template without any storage, the template arguments specify the position of the relevant bits.

    If you need multiple fields, you put multiple specializations of the template together in a union, together with an array of bytes to provide storage.

    The template has overloads for assignment of value and a conversion operator to unsigned for reading the value.

    In addition, if the fields are larger than a byte, they are stored in big-endian byte order, which is sometimes useful when implementing cross-platform protocols.

    here's a usage example:

    union header
    {
        unsigned char arr[2];       // space allocation, 2 bytes (16 bits)
    
        BitFieldMember<0, 4> m1;     // first 4 bits
        BitFieldMember<4, 5> m2;     // The following 5 bits
        BitFieldMember<9, 6> m3;     // The following 6 bits, total 16 bits
    };
    
    int main()
    {
        header a;
        memset(a.arr, 0, sizeof(a.arr));
        a.m1 = rand();
        a.m3 = a.m1;
        a.m2 = ~a.m1;
        return 0;
    }
    

提交回复
热议问题