Bagaimana untuk membaca data binari dalam Python?

PHPz
Lepaskan: 2023-05-08 18:58:06
ke hadapan
2085 orang telah melayarinya

bait

bait: Sejenis jujukan aksara. Dengan membandingkan dir(str) dan dir(bait), kita dapat melihat bahawa sifat dan kaedah kedua-duanya adalah sangat serupa, dengan hanya sedikit perbezaan. Oleh itu, bait juga boleh mempunyai pelbagai kaedah operasi pada jujukan bait seperti rentetan, seperti carian (cari), panjang (len), pemotongan (split), penghirisan, dll.

Kelebihan bait ialah: Kaedah terbina dalam Python, tidak perlu memasang modul pihak ketiga tambahan.

Tetapi kelemahannya juga jelas: ia hanya boleh menanyakan satu pertanyaan dan tidak boleh menanyakan berbilang hasil yang diperlukan pada satu masa.

Mula-mula buka fail melalui mod rb buka dan baca kandungan sebagai jenis bait. Terdapat kaedah find() untuk mencari rentetan tertentu, tetapi kaedah ini hanya boleh mencari indeks rentetan pertama yang memenuhi keperluan, dan ia tidak memberikan indeks bit tunggal, tetapi indeks satu bait 8-bit. Apabila anda perlu mencari berbilang rentetan padanan, tiada kaedah findall() terbina dalam. Jika anda ingin bertanya berbilang, prosesnya akan menyusahkan Mula-mula cari indeks padanan pertama 1, mulakan dengan indeks 1 ini, tanya indeks padanan kedua 2, dan seterusnya sehingga akhir pertanyaan.

with open(path, 'rb') as f:
    datas = f.read()
    start_char = datas.find(b'Start')
    # start_char2 = datas.find(b'Start', start_char)
    end_char = datas.find(b'End', start_char)
    # end_char2 = datas.find(b'End', start_char2)
    data = datas[start_char:end_char]
    print(data)
Salin selepas log masuk

Perhatikan bahawa dalam kod di atas, start_char dan end_char akan muncul beberapa kali, dan masanya tidak semestinya sama Ia adalah perlu untuk mendapatkan kandungan antara kedua-dua indeks, tetapi ia tidak boleh digelung atau pun dicari sekali gus. Baris kod yang dikomen perlu dilaksanakan beberapa kali untuk mendapatkan indeks kata kunci. Memandangkan kami tidak tahu berapa banyak bendera permulaan yang akan ada dalam data fail, kami tidak tahu berapa kali ia akan dilaksanakan Ini harus diselesaikan dengan menggelung, tetapi nampaknya tiada pembolehubah untuk gelung. Ini menjadikan masalah lebih kompleks.

Kedua, memandangkan kandungan antara dua markah diperolehi, proses di atas perlu dilakukan dua kali. Oleh itu, prosesnya lebih rumit.

Oleh itu, adalah perlu untuk mencari kaedah baru.

bitstring

bitstring ialah pakej tiga pihak yang membaca fail binari dalam bentuk strim bait.

Ayat pertama fail bitstring.py ialah: Pakej ini mentakrifkan kelas yang memudahkan penciptaan, manipulasi dan tafsiran data secara bit demi bit, manipulasi dan tafsiran data.

Pemahaman mudah ialah mengendalikan data jenis bait secara langsung.

mempunyai empat kategori utama, seperti berikut:

Bit -- Bekas tidak boleh ubah untuk data binari.
BitArray -- Bekas boleh ubah untuk data binari.

ConstBitStream -- Bekas tidak boleh ubah dengan kaedah penstriman.
BitStream -- Bekas boleh ubah dengan kaedah penstriman.
BitArray -- bekas data binari yang boleh berubah.
ConstBitStream -- Bekas tidak boleh ubah dengan kaedah aliran.

BitStream -- Bekas boleh ubah dengan kaedah penstriman.

Seperti bait, mula-mula baca kandungan fail, cari indeks kata kunci, dan potong untuk mendapatkan kandungan data.

# update at 2022/05/06 start
# from bistring import ConstBitStream, BitStream
from bitstring import ConstBitStream, BitStream
# update at 2022/05/06 end

hex_datas = ConstBitStream(filename=path)  # 读取文件内容
start_char = b'Start'
start_chars = hex_datas.findall(start_char, bytealigned=True)  # 一次找到全部符合的,返回一个生成器
start_indexs = []
for start_char in start_chars:
    start_indexs.append(start_char)

end_char = b'End'
end_indexs = []
for start_index in start_indexs:
    end_chars = hex_datas.find(end_char, start=start_index, bytealigned=True)  # 找到第一个符合的,返回元组
    for end_char in end_chars:
        end_indexs.append(end_char)

result = []
for i in range(min(len(start_indexs), len(end_indexs))):
    hex_data = hex_datas[start_indexs[i]:end_indexs[i]]
    str_data = BitStream.tobytes(hex_data).decode('utf-8')
    result.append(str_data)
Salin selepas log masuk

Analisis kod, mula-mula import dua kelas yang diperlukan: ConstBitStream, BitStream. Untuk mendapatkan kandungan fail, findall() mencari semua indeks rentetan yang sepadan dan find() mencari indeks rentetan yang sepadan yang pertama. Ambil nilai yang lebih kecil daripada dua senarai permulaan dan akhir, dan potong untuk mendapatkan data Jenisnya ialah "bitstring.ConstBitStream() kaedah menukarnya kepada jenis bait, jadi gunakan decode() untuk menyahkod dan mendapatkan rentetan yang diperlukan.
Seluruh proses adalah mudah dan berterusan. Kaedah findall(), find(), dan tobytes() digunakan dalam kod. Di samping itu, terdapat banyak butiran kecil yang perlu diberi perhatian Sebagai contoh, jika start_indexs kosong, kod berikutnya tidak boleh dilaksanakan, dan perkara yang sama berlaku untuk end_indexs jika ia kosong.

Dapat dilihat bahawa pakej bitstring agak mudah digunakan. Mengikut keperluan, agak sedikit kaedah yang digunakan sebenarnya, terdapat banyak kaedah lain, pilih mengikut keperluan.

Atas ialah kandungan terperinci Bagaimana untuk membaca data binari dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan