Thread overview | |||||
---|---|---|---|---|---|
|
November 07, 2018 question about bitfields to decode websocket header | ||||
---|---|---|---|---|
| ||||
I am confused about the bitfields order. mixin(bitfields!( bool, "fin", 1, bool, "rsv1", 1, bool, "rsv2", 1, bool, "rsv3", 1, Opcode, "opcode", 4, bool, "mask", 1, ubyte, "_size", 7, )); output for first byte is 10000001 , the 2st byte 10000011 my code output: opcode=8 mask=true size=65 the real size is 3 byte, and opcode is 1; how to fix this ? |
November 07, 2018 Re: question about bitfields to decode websocket header | ||||
---|---|---|---|---|
| ||||
Posted in reply to test | On Wednesday, 7 November 2018 at 13:05:49 UTC, test wrote:
> I am confused about the bitfields order.
>
> mixin(bitfields!(
> bool, "fin", 1,
> bool, "rsv1", 1,
> bool, "rsv2", 1,
> bool, "rsv3", 1,
> Opcode, "opcode", 4,
>
> bool, "mask", 1,
> ubyte, "_size", 7,
> ));
>
>
> output for first byte is 10000001 , the 2st byte 10000011
>
> my code output: opcode=8 mask=true size=65
>
> the real size is 3 byte, and opcode is 1;
>
> how to fix this ?
The bitfields start with the least significant bits:
fin -> 1
rsv1 -> 0
rsv2 -> 0
rsv3 -> 0
opcode -> 1000 = 8
mask -> 1
_size -> 1000001 = 65
This order will likely be what you want:
mixin(bitfields!(
opcode, "opcode", 4,
bool, "rsv3", 1,
bool, "rsv2", 1,
bool, "rsv1", 1,
bool, "fin", 1,
ubyte, "_size", 7,
bool, "mask", 1,
));
Also beware of endianness when mapping bytes to it.
|
November 08, 2018 Re: question about bitfields to decode websocket header | ||||
---|---|---|---|---|
| ||||
Posted in reply to lithium iodate | On Wednesday, 7 November 2018 at 14:22:43 UTC, lithium iodate wrote: > On Wednesday, 7 November 2018 at 13:05:49 UTC, test wrote: >> I am confused about the bitfields order. >> > The bitfields start with the least significant bits: > fin -> 1 > rsv1 -> 0 > rsv2 -> 0 > rsv3 -> 0 > opcode -> 1000 = 8 > > mask -> 1 > _size -> 1000001 = 65 > > This order will likely be what you want: > mixin(bitfields!( > opcode, "opcode", 4, > bool, "rsv3", 1, > bool, "rsv2", 1, > bool, "rsv1", 1, > bool, "fin", 1, > > ubyte, "_size", 7, > bool, "mask", 1, > )); > > Also beware of endianness when mapping bytes to it. After I use your code it working now. my other question is: if the opcode bit cross byte, how do we define the bitfields ? for example if the opcode is a 6 bit number instead 4bit : F1|R1|R1|R1|opcode6|Mask1|Size5 I has to split the opcode here ? mixin(bitfields!( opcode, "opcode4", 4, bool, "rsv3", 1, bool, "rsv2", 1, bool, "rsv1", 1, bool, "fin", 1, ubyte, "_size", 5, bool, "mask", 1, bool, "opcode2", 1, )); |
Copyright © 1999-2021 by the D Language Foundation