10

Is there a byte buffer object in Python to which I can append values of specific types? (preferably with specifiable endianess)

For example:

buf.add_int(4)    # should add a 4 byte integer
buf.add_short(10) # should add a 2 byte short
buf.add_byte(24)  # should add a byte

I know that I could just use struct.pack but this approach just seems easier. Ideally it should be like the DataOutputStream and DataInputStream objects in Java which do this exact task.

3 Answers 3

11

You can always use bitstring. It is capable of doing all the things you ask and more.

>>> import bitstring
>>> stream=bitstring.BitStream()
>>> stream.append("int:32=4")
>>> stream.append("int:16=10")
>>> stream.append("int:8=24")
>>> stream
BitStream('0x00000004000a18')
>>> stream.bytes
'\x00\x00\x00\x04\x00\n\x18'

Here is a link to the documentation.

Sign up to request clarification or add additional context in comments.

Comments

5

As Kark Knechtel suggests you'll have to make your own type that handles this. Here's a quick extension of bytearray:

import struct

class DataStream(bytearray):

    def append(self, v, fmt='>B'):
        self.extend(struct.pack(fmt, v))

>>> x = DataStream()
>>> x.append(5)
>>> x
bytearray(b'\x05')
>>> x.append(-1, '>i')
>>> x
bytearray(b'\x05\xff\xff\xff\xff')

Comments

1

Just wrap up the struct.pack logic in your own class.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.