How to split a byte string into separate bytes in python

前端 未结 3 777
挽巷
挽巷 2020-12-02 23:00

Ok so I\'ve been using python to try create a waveform image and I\'m getting the raw data from the .wav file using song = wave.open() and so

相关标签:
3条回答
  • 2020-12-02 23:42

    You can use slicing on byte objects:

    >>> value = b'\x00\x01\x00\x02\x00\x03'
    >>> value[:2]
    b'\x00\x01'
    >>> value[2:4]
    b'\x00\x02'
    >>> value[-2:]
    b'\x00\x03'
    

    When handling these frames, however, you probably also want to know about memoryview() objects; these let you interpret the bytes as C datatypes without any extra work on your part, simply by casting a 'view' on the underlying bytes:

    >>> mv = memoryview(value).cast('H')
    >>> mv[0], mv[1], mv[2]
    256, 512, 768
    

    The mv object is now a memory view interpreting every 2 bytes as an unsigned short; so it now has length 3 and each index is an integer value, based on the underlying bytes.

    0 讨论(0)
  • 2020-12-02 23:49

    Here is a way that you can split the bytes into a list:

    data = b'\x00\x00\x00\x00\x00\x00'
    info = [data[i:i+2] for i in range(0, len(data), 2)]
    print info
    

    gives the result:

    ['\x00\x00', '\x00\x00', '\x00\x00']
    
    0 讨论(0)
  • 2020-12-02 23:49

    You are actually asking about serialization/deserialization. Use struct.pack and struct.unpack (https://docs.python.org/3/library/struct.html). This gives you nice primitives to do both unpacking and things like endian swapping. For example:

    import struct
    struct.unpack("<H",b"\x00\x01") # unpacks 2 byte little endian unsigned int
    struct.unpack(">l",b"\x00\x01\x02\x03") # unpacks 4 byte big endian signed int
    

    Note that your example splits 2 byte words, not bytes.

    Since this question is also coming up in searches about splitting binary strings:

    value = b'\x00\x01\x00\x02\x00\x03'
    split = [value[i] for i in range (0, len(value))]
    # now you can modify, for example:
    split[1] = 5
    # put it back together
    joined = bytes(split)
    
    0 讨论(0)
提交回复
热议问题