hi Davis,

I read the std.bitmanip, and I tried to test the code like below:

```
import std.stdio;
import std.array;
import std.bitmanip;
void main(string[] args)
{
    align(1) struct c {
        ushort c1;
        uint c2;
        //ubyte[8] c3;
    }
    ubyte[] buffer;
    auto ap = appender(&buffer);
    uint a = 0x11223344;
    ushort b = 0x6677;
    ap.append!uint(a);
    ap.append!ushort(b);

    c cobj;
    cobj.c1 = 0xEEFF;
    cobj.c2 = 0xDEADBEAF;
    //cobj.c3 = [0x12, 0x34, 0x56, 0x78];
    ap.append(cobj);

    ubyte[3] d = [0xAA, 0xBB, 0xCC];
    ap.append(d);

    foreach(e; buffer) {
        writef("%02X ", e);
    }
}
```
For compiling this code, I got error like this

onlineapp.d(22): Error: template std.bitmanip.append cannot deduce function from >argument types !()(RefAppender!(ubyte[]), c), candidates are: /dlang/dmd/linux/bin64/../../src/phobos/std/bitmanip.d(3623): std.bitmanip.append(T, Endian endianness = Endian.bigEndian, R)(R range, T value) >if (canSwapEndianness!T && isOutputRange!(R, ubyte)) onlineapp.d(25): Error: template std.bitmanip.append cannot deduce function from >argument types !()(RefAppender!(ubyte[]), ubyte[3]), candidates are: /dlang/dmd/linux/bin64/../../src/phobos/std/bitmanip.d(3623): std.bitmanip.append(T, Endian endianness = Endian.bigEndian, R)(R range, T value) >if (canSwapEndianness!T && isOutputRange!(R, ubyte))

It seems that the appending is just allow using the fundamental types like uint, ushort, it does not support struct, and can't support dynamic array too. As the hardware protocol is a dynamic-length style, so I also need to support append array or another buffer directly.

It seems that I can't get the point how to using the bitmanip to do the packing I need, and also I have no idea what the unpacking will look like.

Thanks!

Reply via email to