Search code examples
pythonpython-3.xstructpython-2to3

struct unpack (Type Error: a byte like object is required, not 'str"), Unpack a List?


Attempting to use script that was built in Python 2, and now use it in Python 3 without adding a version 2 onto system. For the script, the only error I get is related to a struct.unpack at this line....

def go_parse(rec_list):
    size = (len(rec_list) - 4) / 4
    first_arg = "%sI" % size
    return struct.unpack(first_arg, (rec_list.rstrip ('\xff\xff\xff\xff')))

at line 4 of this function, I get the error:

TypeError: a bytes-like object is required, not 'str'

I read several other posts regarding this, and that it needs to be explicitly labeled as bytes, but I cant seem to figure out where to explicitly label that in this context. The other examples on SO i found here and here, did not provide much of an explanation to it. The struct pages don't seem to cover the error possibilities of 2-3...Only that struct.unpack(fmt, buffer) has the two arguments of fmt and buffer. Based on those examples, i have tried identifying this as bytes explicitly as a second arg using b, as well as bytes before the arguments and on the tuple for the .strip. I attempted return this as a bytearray, but that seemed to produce the same errors.

As an alternative, I am able to get the byte data I wanted into a list as shown below, what would be a way to get the list into unpack, attempt b'i' just looks at i as bytes.

list1 = [b'\x03\x00\x00\x00\xff\xff\xff\xff',
b'\x07\x00\x00\x00\x06\x00\x00\x00\xff\xff\xff\xff']

print(struct.unpack('<s', bytes(i)))

The bytes are of varying length, but all end in \xff\xff\xff\xff. The data I am looking at is text, just trying to bring it back to text.


Solution

  • I answered my own question spending some time in the Documentation, and someone pointing me in the right direction.

    Generating a list of binary data that needed to be brought back to text for display, I used the codecs, a standard library. All my binary data was saved into a list named bin_list.

    import codecs
    
    bin_list = [b'Some Binary data', b'some more binary data']
    
    for i in bin_list:    # used the loop to print each to new line, nice and neat
        print (codecs.decode(i, "utf-8", "ignore"))   # or any other conversion avilable on codecs.