diff --git a/src/genpy/generate_struct.py b/src/genpy/generate_struct.py index e6fa8f3..eac107a 100644 --- a/src/genpy/generate_struct.py +++ b/src/genpy/generate_struct.py @@ -186,3 +186,17 @@ def unpack3(var, struct_var, buff): :param buff: buffer that the unpack reads from, ``StringIO`` """ return '%s = %s.unpack(%s)' % (var, struct_var, buff) + + +def memoryview_len(view): + """ + Compute the size (in bytes) of a ``memoryview`` object. + + This is the same as memoryview.nbytes, but compatible with Python 2. + + :param view: The ``memoryview`` object. + """ + length = view.itemsize + for s in view.shape: + length *= s + return length diff --git a/src/genpy/generator.py b/src/genpy/generator.py index e972aa9..f5c56ef 100644 --- a/src/genpy/generator.py +++ b/src/genpy/generator.py @@ -470,27 +470,37 @@ def string_serializer_generator(package, type_, name, serialize): # noqa: D401 # check to see if its a uint8/byte type, in which case we need to convert to string before serializing base_type, is_array, array_len = genmsg.msgs.parse_type(type_) if base_type in ['uint8', 'char']: - yield '# - if encoded as a list instead, serialize as bytes instead of string' + yield '# check for buffer protocol support' if array_len is None: yield 'try:' - yield INDENT+'tmp = memoryview(%s) if python3 else buffer(%s)' % (var, var) - yield INDENT+pack2("'