Re: Array alignment while marshalling data
Simon McVittie <simon.mcvittie-ZGY8ohtN/[email protected]>
| Newsgroups | gmane.comp.freedesktop.dbus |
|---|---|
| Organization | Collabora Ltd. |
| Message-ID | <[email protected]> |
On 23/05/16 19:46, [email protected] wrote: > the array length is not aligned to 8 bytes, but to 4 bytes. But type of > this array is struct, which according to the specification should always > align to 8 bytes. The header field array isn't a struct, it's an array (which happens to contain structs). The array length is a 4-byte integer, so it's aligned to a multiple of 4 bytes. After the length, there are some number of structs, and *those* are aligned to a multiple of 8 bytes. In effect, the beginning of every message looks like this: bytes 0-3: header start, four 1-byte quantities 4-7: body length 8-11: serial No padding, 12 is already a multiple of 4 12-15: header field array length No padding, 16 is already a multiple of 8 16+: first header field struct Let's say the first header field struct happens to be 13 bytes long. We'd continue as follows: 16-28: first header field struct 29-31: 3 bytes of padding to reach next multiple of 8 32+: second header field struct (Yes, this means the marshalling for `a(whatever)`, an array of structs, is not the same as the marshalling for `(a(whatever))`, a struct containing a single array of structs. There's no particular reason, it's just how this stuff was designed 10+ years ago.) Regards, S -- Simon McVittie Collabora Ltd. <http://www.collabora.com/> _______________________________________________ dbus mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dbus