Passing a sequence of bits to a file python

前端 未结 1 1110
不思量自难忘°
不思量自难忘° 2021-01-20 09:53

As a part of a bigger project, I want to save a sequence of bits in a file so that the file is as small as possible. I\'m not talking about compression, I want to save the s

相关标签:
1条回答
  • 2021-01-20 10:15

    technically you can not write less than a byte because the os organizes memory in bytes (write individual bits to a file in python), so this is binary file io, see https://docs.python.org/2/library/io.html there are modules like struct

    open the file with the 'b' switch, indicates binary read/write operation, then use i.e. the to_bytes() function (Writing bits to a binary file) or struct.pack() (How to write individual bits to a text file in python?)

      with open('somefile.bin', 'wb') as f:
    
     import struct
     >>> struct.pack("h", 824)
    '8\x03'
    
    >>> bits = "10111111111111111011110"
    >>> int(bits[::-1], 2).to_bytes(4, 'little')
    b'\xfd\xff=\x00'
    

    if you want to get around the 8 bit (byte) structure of the memory you can use bit manipulation and techniques like bitmasks and BitArrays see https://wiki.python.org/moin/BitManipulation and https://wiki.python.org/moin/BitArrays

    however the problem is, as you said, to read back the data if you use BitArrays of differing length i.e. to store a decimal 7 you need 3 bit 0x111 to store a decimal 2 you need 2 bit 0x10. now the problem is to read this back. how can your program know if it has to read the value back as a 3 bit value or as a 2 bit value ? in unorganized memory the sequence decimal 72 looks like 11110 that translates to 111|10 so how can your program know where the | is ?

    in normal byte ordered memory decimal 72 is 0000011100000010 -> 00000111|00000010 this has the advantage that it is clear where the | is

    this is why memory on its lowest level is organized in fixed clusters of 8 bit = 1 byte. if you want to access single bits inside a bytes/ 8 bit clusters you can use bitmasks in combination with logic operators (http://www.learncpp.com/cpp-tutorial/3-8a-bit-flags-and-bit-masks/). in python the easiest way for single bit manipulation is the module ctypes

    if you know that your values are all 6 bit maybe it is worth the effort, however this is also tough...

    (How do you set, clear, and toggle a single bit?)

    (Why can't you do bitwise operations on pointer in C, and is there a way around this?)

    0 讨论(0)
提交回复
热议问题