digitalmars.D.learn - question about bitfields to decode websocket header
- test (15/15) Nov 07 2018 I am confused about the bitfields order.
- lithium iodate (20/35) Nov 07 2018 The bitfields start with the least significant bits:
- test (18/40) Nov 07 2018 After I use your code it working now.
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 ?
Nov 07 2018
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.
Nov 07 2018
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: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, ));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.
Nov 07 2018