Actually, that's just one of several different packet types for SMPP, and
not included there are the optional parameters. I'm reading your
documentation on Pack [1] and I'm not seeing anything that can actually
handle the optional part of the SUBMIT_SM packet (what I'm actually encoding
there). You list:
atomic A single instance
sequence Multiple values in a given order
array Multiple values of the same type
struct Ordered collection of named values
The optional parts of the SUBMIT_SM are a series of values that can appear
in any order. Now, they all follow a similar format:
tag 2 byte integer network byte order
length 2 byte integer network byte order
value variable, based upon length
For an even weirder example, we have a custom binary format.
tag 1 or 3 bytes
length 1 or 3 bytes
value variable length
For the tag or length, if the byte is less than 255, then that's the
value; if it is 255, then the actual value is the next two bytes, in network
byte order. The order of tags does not matter, *except* that tag value of 1
should always be first.
CBOR [2] is similar---integer values can be 1 byte, 2 bytes, 3 bytes, 5
bytes or 9 bytes in size, and the type is encoded with the value in some
cases.
Then there are protocols like IP, where some fields are only a few bits in
size, but it looks like you handle that somewhat.
-spc
[1] https://github.com/tobbik/lua-t/blob/master/docs/Pack.rst
[2] Concise Binary Object Representation RFC-7049
http://cbor.io/