Hướng dẫn how to read bits in python - cách đọc bit trong python

Như câu trả lời được chấp nhận, các I/O Python tiêu chuẩn chỉ có thể đọc và viết toàn bộ byte tại một thời điểm. Tuy nhiên, bạn có thể mô phỏng một luồng bit như vậy bằng cách sử dụng công thức này cho I/O bitwise.

Cập nhật

Sau khi sửa đổi phiên bản Python của Rosetta Code để hoạt động không thay đổi trong cả Python 2 & 3, tôi đã kết hợp những thay đổi đó vào câu trả lời này.

Ngoài ra, sau đó, sau khi được truyền cảm hứng từ một bình luận được đưa ra bởi @mhernandez, tôi đã sửa đổi thêm mã Rosetta để nó hỗ trợ giao thức được gọi là Trình quản lý ngữ cảnh cho phép các phiên bản của cả hai lớp của nó được sử dụng trong các câu lệnh Python

import sys
import bitio

r = bitio.BitReader[sys.stdin]
while True:
    x = r.readbits[7]
    if not r.read:  # nothing read
        break
    sys.stdout.write[chr[x]]
2. Phiên bản mới nhất được hiển thị bên dưới:

class BitWriter[object]:
    def __init__[self, f]:
        self.accumulator = 0
        self.bcount = 0
        self.out = f

    def __enter__[self]:
        return self

    def __exit__[self, exc_type, exc_val, exc_tb]:
        self.flush[]

    def __del__[self]:
        try:
            self.flush[]
        except ValueError:   # I/O operation on closed file.
            pass

    def _writebit[self, bit]:
        if self.bcount == 8:
            self.flush[]
        if bit > 0:
            self.accumulator |= 1  0:
            self._writebit[bits & 1  self.bcount-1
        self.bcount -= 1
        return rv

    def readbits[self, n]:
        v = 0
        while n > 0:
            v = [v  0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]

... và để "cắt bỏ" cùng một luồng:

import sys
import bitio

r = bitio.BitReader[sys.stdin]
while True:
    x = r.readbits[7]
    if not r.read:  # nothing read
        break
    sys.stdout.write[chr[x]]

Python đọc tệp nhị phân vào mảng byte trước, tệp được mở trong chế độ RB RB. Một mảng byte được gọi là mybytearray được khởi tạo bằng phương thức bytearray []. Sau đó, tệp được đọc một byte tại một thời điểm bằng cách sử dụng F.Read [1] và được gắn vào mảng byte bằng toán tử += =.

Làm thế nào để Python đọc dữ liệu nhị phân?

  • Hàm Open [] mở một tệp ở định dạng văn bản theo mặc định. Để mở một tệp ở định dạng nhị phân, thêm 'B' vào tham số chế độ. Do đó, chế độ "RB" mở tệp ở định dạng nhị phân để đọc, trong khi chế độ "WB" mở tệp ở định dạng nhị phân để viết. Không giống như các tệp văn bản, các tệp nhị phân không thể đọc được của con người.
  • Làm thế nào để bạn lấy bit trong Python?
  • Trong Python, các toán tử bitwise được sử dụng để thực hiện các tính toán bitwise trên các số nguyên. Các số nguyên trước tiên được chuyển đổi thành nhị phân và sau đó các hoạt động được thực hiện theo từng bit, do đó tên các toán tử bitwise. Sau đó kết quả được trả về ở định dạng thập phân.
  • Dưới đây là một số thông tin và mục tiêu liên quan đến thao tác bit Python, thao tác nhị phân.
  • Một số nhiệm vụ bao gồm:
  • Biến "11011000111101 ..." thành byte, [đệm trái hoặc phải, 0 hoặc 1,] và ngược lại.

Các thư viện có liên quan bao gồm:

  • CTYPES - Một thư viện chức năng nước ngoài cho Python - Python v2.7.3 Tài liệu - một phần của thư viện tiêu chuẩn

  • Bitarray - Mảng hiệu quả của Booleans - C Tiện ích mở rộng

  • Python -bitstring - Một mô -đun Python để giúp bạn quản lý các bit của mình. - Lưu trữ dự án Google

  • BITSTRUCT - Mô -đun này thực hiện chuyển đổi giữa các giá trị python và các cấu trúc trường bit C được biểu thị dưới dạng bytearrays python.

Một số mã đơn giản là tại ASPN: thao tác trường bit.

Dưới đây là một số ví dụ khác.

Thao tác

Đến số nguyên.

   1 >>> print int['00100001', 2]
   2 33

Đến chuỗi hex. Lưu ý rằng bạn không cần sử dụng các bit x8.

   1 >>> print "0x%x" % int['11111111', 2]
   2 0xff
   3 >>> print "0x%x" % int['0110110110', 2]
   4 0x1b6
   5 >>> print "0x%x" % int['0010101110101100111010101101010111110101010101', 2]
   6 0xaeb3ab57d55

Để nhân vật. 8 bit tối đa.

   1 >>> chr[int['111011', 2]]
   2 ';'
   3 >>> chr[int['1110110', 2]]
   4 'v'
   5 >>> chr[int['11101101', 2]]
   6 '\xed'

Ký tự cho số nguyên, nhưng không phải là chuỗi của 1 và 0.

   1 >>> int['01110101', 2]
   2 117
   3 >>> chr[int['01110101', 2]]
   4 'u'
   5 >>> ord['u']
   6 117

Bit cá nhân.

   1 >>> 1 >> 1 >> 1 >> 1 >> 1 >> 1 >> 1 >> 1 >> int['0xff',16]
   2 255
   3 >>> int['d484fa894e',16]
   4 912764078414

Không sử dụng các lựa chọn thay thế sử dụng Eval. Eval sẽ thực thi mã được truyền cho nó và do đó có thể thỏa hiệp bảo mật chương trình của bạn.

Số nguyên vào chuỗi bin

Python 3 hỗ trợ các tác phẩm nhị phân [ví dụ: 0b10011000] và có hàm bin []. Cho các phiên bản cũ hơn:

   1 >>> def bin[a]:
   2         s=''
   3         t={'0':'000','1':'001','2':'010','3':'011',
   4            '4':'100','5':'101','6':'110','7':'111'}
   5         for c in oct[a][1:]:
   6                 s+=t[c]
   7         return s

hoặc tốt hơn:

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
0

Số nguyên Python

Từ trang "Tham chiếu ngôn ngữ Python" trên mô hình dữ liệu:

"Các số nguyên [int] Các số này thể hiện các số trong một phạm vi không giới hạn, chỉ có bộ nhớ [ảo] chỉ có sẵn. Với mục đích hoạt động thay đổi và mặt nạ, một biểu diễn nhị phân được giả định và các số âm được biểu diễn trong một biến thể của 2 Ảo tưởng về một chuỗi vô hạn các bit dấu hiệu kéo dài sang trái. "

Trước Python 3.1, không có cách nào dễ dàng để xác định làm thế nào Python đại diện cho một số nguyên cụ thể trong nội bộ, tức là có bao nhiêu bit được sử dụng. Python 3.1 thêm một phương thức bit_length [] vào loại int thực hiện chính xác điều đó.

Trừ khi bạn biết rằng bạn đang làm việc với các số ít hơn một độ dài nhất định, ví dụ: các số từ các mảng số nguyên, ca làm việc, xoay, v.v. có thể cho kết quả không mong muốn.

Số lượng bộ bit cao nhất là công suất cao nhất 2 nhỏ hơn hoặc bằng số nguyên đầu vào. Điều này giống như số mũ của biểu diễn điểm nổi của số nguyên và còn được gọi là "Cơ sở số nguyên số nguyên 2". [Ref.1]

Trong các phiên bản trước 3.1, cách dễ nhất để xác định bộ bit cao nhất là*:

* Có một cuộc thảo luận dài về chủ đề này, và tại sao phương pháp này không tốt, trong "Vấn đề 3439" tại python.org: //bugs.python.org/issue3439 Cuộc thảo luận này đã dẫn đến việc bổ sung bit_lengm [] trong Python 3.1.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
1

Một đầu vào nhỏ hơn hoặc bằng 0 kết quả trong "Lỗi miền Math: Matherror: Math"

Phần "Tìm cơ sở nhật ký số nguyên 2 của một số nguyên" trên "Trang web Hacks Twiddling Bit" [ref.1] bao gồm một số phương thức để xác định giá trị này cho các số nguyên có độ lớn đã biết, có lẽ khi không có trình điều trị toán học. Phương pháp duy nhất thường áp dụng cho các số nguyên python có độ lớn không xác định là "cách rõ ràng" của việc đếm số lượng hoạt động thay đổi bitwise cần thiết để giảm đầu vào xuống 0.

Chiều dài bit của một số nguyên python

Bitlen [] đếm độ dài bit thực tế của một số nguyên python, nghĩa là số lượng bit không khác cao nhất cộng với 1. 0, không có bit khác không, trả về 0. như mong đợi từ trích dẫn ở trên " Ảo tưởng về một chuỗi các bit dấu hiệu vô hạn kéo dài sang trái, "Một số âm ném máy tính vào một vòng lặp vô hạn.

Hàm có thể trả về bất kỳ kết quả nào lên đến chiều dài của số nguyên lớn nhất bộ nhớ máy tính của bạn có thể giữ được.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
2

Phương pháp sử dụng mô -đun toán học nhanh hơn nhiều, đặc biệt là với số lượng lớn với hàng trăm chữ số thập phân.

bitLenCount[]

Trong sử dụng chung, "số lượng bit" của số nguyên là số lượng bộ [1] bit, không phải độ dài bit của số nguyên được mô tả ở trên. Bitlen [] có thể được sửa đổi để cũng cung cấp số lượng các bit được đặt trong số nguyên. Có các phương pháp nhanh hơn để có được số lượng bên dưới.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
3

Hoạt động trên số nguyên không xác định

Một số thủ tục không cần biết mức độ của một số nguyên để cho kết quả có ý nghĩa.

bitCount[]

Quy trình và thông tin dưới đây đã được tìm thấy trong "Bit Twiddling Hacks" [ref.1]

  • - - - - - - - - - - - - - - - - - - - - - - - - -

Đếm bộ bit, cách của Brian Kernighan*

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
4

Phương pháp này đi qua nhiều lần lặp như có các bit được đặt. Vì vậy, nếu chúng ta có một từ 32 bit chỉ có bộ bit cao, thì nó sẽ chỉ đi một lần qua vòng lặp.

* Ngôn ngữ lập trình C tái bản lần 2, Kernighan & Ritchie, 1988.

Don Knuth chỉ ra rằng phương pháp này đã được Peter Wegner xuất bản trong CACM 3 [1960], 322. Cũng được Derrick Lehmer phát hiện độc lập và xuất bản năm 1964 trong một cuốn sách do Beckenbach biên tập.

  • - - - - - - - - - - - - - - - - - - - - - - - - -

Kernighan và Knuth, chứng thực mạnh mẽ!

Điều này hoạt động vì mỗi phép trừ "mượn" từ 1 bit thấp nhất. Ví dụ:

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
5

Đó là một kỹ thuật tuyệt vời cho Python, vì kích thước của số nguyên không cần phải được xác định trước.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
6

parityOf[]

Từ "Bit Twiddling Hacks"

Mã gần như giống hệt với bitcount [], ở trên, tính toán tính tương đương của một số nguyên, trả về 0 nếu có số lượng các bit đặt chẵn và -1 nếu có một số lẻ. Trên thực tế, việc đếm các bit và kiểm tra xem kết quả có kỳ lạ với Bitcount & 1 có cùng tốc độ với hàm chẵn lẻ hay không.bitcount & 1 is about the same speed as the parity function.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
7

lowestSet[]

Để xác định số bit của bit thấp nhất được đặt trong một số nguyên, trong ký hiệu bổ sung twos I & -i không tất cả trừ bit được đặt thấp nhất. Kỷ yếu bitlen [] sau đó xác định vị trí của nó. Rõ ràng, số âm trả về kết quả tương tự như đối diện của chúng. Trong phiên bản này, đầu vào là 0 trả về -1, có hiệu lực là một điều kiện lỗi.i & -i zeroes all but the lowest set bit. The bitLen[] proceedure then determines its position. Obviously, negative numbers return the same result as their opposite. In this version, an input of 0 returns -1, in effect an error condition.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
8

Bit đơn

Các hoạt động một bit thông thường sẽ hoạt động trên bất kỳ số nguyên Python nào. Tùy thuộc vào lập trình viên để chắc chắn rằng giá trị của 'Offset' có ý nghĩa trong bối cảnh của chương trình.

import sys
import bitio

o = bitio.BitWriter[sys.stdout]
c = sys.stdin.read[1]
while len[c] > 0:
    o.writebits[ord[c], 7]
    c = sys.stdin.read[1]
o.flush[]
9

Trường bit, ví dụ: cho các giao thức truyền thông

Nếu bạn cần giải thích các bit riêng lẻ trong một số dữ liệu, ví dụ: Một luồng byte Trong một giao thức truyền thông, bạn có thể sử dụng mô -đun CTYPES.

import sys
import bitio

r = bitio.BitReader[sys.stdin]
while True:
    x = r.readbits[7]
    if not r.read:  # nothing read
        break
    sys.stdout.write[chr[x]]
0

import sys
import bitio

r = bitio.BitReader[sys.stdin]
while True:
    x = r.readbits[7]
    if not r.read:  # nothing read
        break
    sys.stdout.write[chr[x]]
1

Người giới thiệu

Ref.1. "Bit Twiddling Hacks" của Sean Eron Anderson

  • //graphics.stanford.edu/~seander/bithacks.html

ref.2. "Nghệ thuật ngôn ngữ hội" của Randall Hyde

  • //webster.cs.ucr.edu/aoa/index.html Tập 4, Chương 5 "Thao tác bit"

Ref.3. Hacker's Delight

  • //www.hackersdelight.org/

Liên kết nghiên cứu

Đây là loại điều chúng tôi đang tìm kiếm:

  • ASPN: Thao tác trường bit

Các mô -đun liên quan:

  • Mô -đun mảng - [phát hành với Python]

  • Mô -đun cấu trúc - [phát hành với Python]

  • Mô -đun Binascii - [phát hành với Python]

  • Mô -đun Pyserial - Truy cập cổng nối tiếp

Xem thêm: BitWiseOperators

Làm thế nào để bạn đọc byte trong Python?

Sử dụng Open [] và File.Read [] để đọc byte từ tệp nhị phân..
File = Open ["Sample.bin", "RB"].
Byte = Tệp. Đọc [1].
Trong khi byte: byte = false ở cuối tệp ..
print[byte].
Byte = Tệp. Đọc [1].
Trong khi byte: byte = false ở cuối tệp ..

tập tin. gần[].

Python đọc tệp nhị phân vào mảng byte trước, tệp được mở trong chế độ RB RB.Một mảng byte được gọi là mybytearray được khởi tạo bằng phương thức bytearray [].Sau đó, tệp được đọc một byte tại một thời điểm bằng cách sử dụng F.Read [1] và được gắn vào mảng byte bằng toán tử += =.read one byte at a time using f. read[1] and appended to the byte array using += operator.

Làm thế nào để Python đọc dữ liệu nhị phân?

Hàm Open [] mở một tệp ở định dạng văn bản theo mặc định.Để mở một tệp ở định dạng nhị phân, thêm 'B' vào tham số chế độ.Do đó, chế độ "RB" mở tệp ở định dạng nhị phân để đọc, trong khi chế độ "WB" mở tệp ở định dạng nhị phân để viết.Không giống như các tệp văn bản, các tệp nhị phân không thể đọc được của con người.add 'b' to the mode parameter. Hence the "rb" mode opens the file in binary format for reading, while the "wb" mode opens the file in binary format for writing. Unlike text files, binary files are not human-readable.

Làm thế nào để bạn lấy bit trong Python?

Trong Python, các toán tử bitwise được sử dụng để thực hiện các tính toán bitwise trên các số nguyên.Các số nguyên trước tiên được chuyển đổi thành nhị phân và sau đó các hoạt động được thực hiện theo từng bit, do đó tên các toán tử bitwise.Sau đó kết quả được trả về ở định dạng thập phân.bitwise operators are used to performing bitwise calculations on integers. The integers are first converted into binary and then operations are performed on bit by bit, hence the name bitwise operators. Then the result is returned in decimal format.

Bài Viết Liên Quan

Chủ Đề