Using Python How can I read the bits in a byte?

前端 未结 9 544
礼貌的吻别
礼貌的吻别 2020-12-05 06:55

I have a file where the first byte contains encoded information. In Matlab I can read the byte bit by bit with var = fread(file, 8, \'ubit1\'), and then retrie

9条回答
  •  生来不讨喜
    2020-12-05 07:01

    There are two possible ways to return the i-th bit of a byte. The "first bit" could refer to the high-order bit or it could refer to the lower order bit.

    Here is a function that takes a string and index as parameters and returns the value of the bit at that location. As written, it treats the low-order bit as the first bit. If you want the high order bit first, just uncomment the indicated line.

    def bit_from_string(string, index):
           i, j = divmod(index, 8)
    
           # Uncomment this if you want the high-order bit first
           # j = 8 - j
    
           if ord(string[i]) & (1 << j):
                  return 1
           else:
                  return 0
    

    The indexing starts at 0. If you want the indexing to start at 1, you can adjust index in the function before calling divmod.

    Example usage:

    >>> for i in range(8):
    >>>       print i, bit_from_string('\x04', i)
    0 0
    1 0
    2 1
    3 0
    4 0
    5 0
    6 0
    7 0
    

    Now, for how it works:

    A string is composed of 8-bit bytes, so first we use divmod() to break the index into to parts:

    • i: the index of the correct byte within the string
    • j: the index of the correct bit within that byte

    We use the ord() function to convert the character at string[i] into an integer type. Then, (1 << j) computes the value of the j-th bit by left-shifting 1 by j. Finally, we use bitwise-and to test if that bit is set. If so return 1, otherwise return 0.

提交回复
热议问题