Paket python int ke byte

Modul ini melakukan konversi antara nilai Python dan struktur C yang direpresentasikan sebagai objek Python. Ini dapat digunakan dalam menangani data biner yang disimpan dalam file atau dari koneksi jaringan, di antara sumber lainnya. Ini digunakan sebagai deskripsi ringkas tata letak struct C dan konversi yang dimaksudkan ke/dari nilai Python

Catatan

Secara default, hasil pengepakan struct C yang diberikan menyertakan pad byte untuk menjaga keselarasan yang tepat untuk tipe C yang terlibat; . Perilaku ini dipilih sehingga byte dari struct yang dikemas sesuai persis dengan tata letak di memori dari struct C yang sesuai. Untuk menangani format data platform-independen atau menghilangkan byte pad implisit, gunakan ukuran dan perataan standard sebagai ganti ukuran dan perataan native. lihat detailnya

Beberapa fungsi (dan metode ) menggunakan argumen penyangga. Ini mengacu pada objek yang mengimplementasikan dan menyediakan buffer yang dapat dibaca atau dibaca-ditulis. Jenis yang paling umum digunakan untuk tujuan itu adalah and , tetapi banyak jenis lain yang dapat dilihat sebagai larik byte yang mengimplementasikan protokol buffer, sehingga dapat dibaca/diisi tanpa penyalinan tambahan dari objek

7. 1. 1. Fungsi dan Pengecualian

Modul ini mendefinisikan pengecualian dan fungsi berikut

pengecualian
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
4

Pengecualian diajukan pada berbagai kesempatan;

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
6 ( fmt, v1, v2,. )

Mengembalikan objek byte yang berisi nilai v1, v2,. dikemas sesuai dengan format string fmt. Argumen harus sama persis dengan nilai yang diperlukan oleh format

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
8 ( fmt, buffer, offset, v1, v2,. )

Kemas nilai v1, v2,. sesuai dengan format string fmt dan tulis byte yang dikemas ke dalam buffer buffer yang dapat ditulis mulai dari offset posisi. Perhatikan bahwa offset adalah argumen yang diperlukan

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
0 ( fmt, buffer )

Buka paket dari buffer buffer (mungkin dikemas oleh

>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
1) sesuai format string fmt. Hasilnya adalah sebuah tuple meskipun hanya berisi satu item. Ukuran buffer dalam byte harus sesuai dengan ukuran yang dibutuhkan oleh format, sebagaimana dicerminkan oleh

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
4 ( fmt, buffer, offset=0 )

Unpack dari buffer mulai dari offset posisi, sesuai dengan format string fmt. Hasilnya adalah sebuah tuple meskipun hanya berisi satu item. Ukuran buffer dalam byte, minus offset, harus setidaknya ukuran yang dibutuhkan oleh format, seperti yang ditunjukkan oleh

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
7 ( fmt, buffer )

Unpack secara iteratif dari buffer buffer sesuai dengan format string fmt. Fungsi ini mengembalikan iterator yang akan membaca potongan berukuran sama dari buffer sampai semua isinya telah dikonsumsi. Ukuran buffer dalam byte harus merupakan kelipatan dari ukuran yang dibutuhkan oleh format, seperti yang ditunjukkan oleh

Setiap iterasi menghasilkan tuple seperti yang ditentukan oleh format string

Baru di versi 3. 4

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
0 ( fmt )

Kembalikan ukuran struct (dan karenanya objek bytes yang dihasilkan oleh

>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
1) sesuai dengan format string fmt

7. 1. 2. Memformat String

String format adalah mekanisme yang digunakan untuk menentukan tata letak yang diharapkan saat mengemas dan membongkar data. Mereka dibangun dari , yang menentukan jenis data yang sedang dikemas/dibongkar. Selain itu, ada karakter khusus untuk mengontrol

7. 1. 2. 1. Urutan Byte, Ukuran, dan Perataan

Secara default, tipe C direpresentasikan dalam format asli mesin dan urutan byte, dan diselaraskan dengan benar dengan melewatkan byte pad jika perlu (sesuai dengan aturan yang digunakan oleh kompiler C)

Alternatifnya, karakter pertama dari string format dapat digunakan untuk menunjukkan urutan byte, ukuran, dan perataan data yang dikemas, menurut tabel berikut

CharacterByte orderSizeAlignment
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
2nativenativenative
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
3nativestandardnone
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
4little-endianstandardnone
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
5big-endianstandardnone
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
6network (= big-endian)standardnone

Jika karakter pertama bukan salah satunya, diasumsikan

>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
7

Urutan byte asli adalah big-endian atau little-endian, tergantung pada sistem host. Misalnya, Intel x86 dan AMD64 (x86-64) adalah little-endian; . Gunakan

>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
_8 untuk memeriksa keberakhiran sistem Anda

Ukuran dan perataan asli ditentukan menggunakan ekspresi

>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
9 kompiler C. Ini selalu digabungkan dengan urutan byte asli

Ukuran standar hanya bergantung pada format karakter;

Perhatikan perbedaan antara

>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
_7 dan struct1. keduanya menggunakan urutan byte asli, tetapi ukuran dan perataan yang terakhir distandarisasi

Formulir struct2 tersedia untuk jiwa-jiwa malang yang mengaku tidak dapat mengingat apakah urutan byte jaringan adalah big-endian atau little-endian

Tidak ada cara untuk menunjukkan urutan byte non-native (memaksa byte-swapping);

Catatan

  1. Padding hanya ditambahkan secara otomatis di antara anggota struktur yang berurutan. Tidak ada padding yang ditambahkan di awal atau akhir dari struct yang disandikan
  2. No padding is added when using non-native size and alignment, e.g. with ‘<’, ‘>’, ‘=’, and ‘!’.
  3. Untuk menyelaraskan akhir struktur dengan persyaratan penyelarasan jenis tertentu, akhiri format dengan kode untuk jenis tersebut dengan jumlah pengulangan nol. Lihat

7. 1. 2. 2. Memformat Karakter

Format karakter memiliki arti sebagai berikut; . Kolom 'Ukuran standar' mengacu pada ukuran nilai yang dikemas dalam byte saat menggunakan ukuran standar; . Saat menggunakan ukuran asli, ukuran nilai yang dikemas bergantung pada platform

FormatC TypePython typeStandard sizeNotesstruct9pad byteno value  bytes0bytes1bytes of length 11 bytes2bytes3integer1(1),(3)bytes4bytes5integer1(3)bytes6bytes7bool1(1)bytes8bytes9integer2(3)standard0standard1integer2(3)standard2standard3integer4(3)standard4standard5integer4(3)standard6standard7integer4(3)standard8standard9integer4(3)

Berubah di versi 3. 3. Menambahkan dukungan untuk format struct9 dan Struct0.

Berubah di versi 3. 6. Menambahkan dukungan untuk format Struct1.

Catatan

  1. Kode konversi Struct2 sesuai dengan jenis bytes7 yang ditentukan oleh C99. Jika jenis ini tidak tersedia, ini disimulasikan menggunakan bytes1. Dalam mode standar, selalu diwakili oleh satu byte

  2. Kode konversi Struct5 dan Struct6 tersedia dalam mode asli hanya jika kompiler platform C mendukung C native1, atau, di Windows, Struct8. Mereka selalu tersedia dalam mode standar

  3. Saat mencoba mengemas non-bilangan bulat menggunakan salah satu kode konversi bilangan bulat, jika non-bilangan bulat memiliki metode maka metode tersebut dipanggil untuk mengonversi argumen menjadi bilangan bulat sebelum mengemas

    Berubah di versi 3. 2. Penggunaan metode untuk bukan bilangan bulat adalah hal baru di 3. 2.

  4. Kode konversi struct9 dan Struct0 hanya tersedia untuk ukuran asli (dipilih sebagai default atau dengan karakter urutan

    >>> pack('llh0l', 1, 2, 3)
    b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
    
    7 byte). Untuk ukuran standar, Anda dapat menggunakan format bilangan bulat mana saja yang sesuai dengan aplikasi Anda

  5. Untuk kode konversi

    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    04,
    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    05 dan Struct1, representasi yang dikemas menggunakan format IEEE 754 binary32, binary64 atau binary16 (untuk
    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    04,
    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    05 atau Struct1), terlepas dari format floating-point yang digunakan oleh platform

  6. Karakter format

    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    10 hanya tersedia untuk pengurutan byte asli (dipilih sebagai default atau dengan karakter urutan
    >>> pack('llh0l', 1, 2, 3)
    b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
    
    7 byte). Karakter urutan byte struct_1 memilih untuk menggunakan urutan little- atau big-endian berdasarkan sistem host. Modul struct tidak menafsirkan ini sebagai pemesanan asli, sehingga format
    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    10 tidak tersedia

  7. Jenis "setengah presisi" IEEE 754 binary16 diperkenalkan pada revisi 2008 dari. Ini memiliki bit tanda, eksponen 5-bit dan presisi 11-bit (dengan 10 bit disimpan secara eksplisit), dan dapat mewakili angka antara kira-kira

    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    14 dan
    >>> record = b'raymond   \x32\x12\x08\x01\x08'
    >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
    
    >>> from collections import namedtuple
    >>> Student = namedtuple('Student', 'name serialnum school gradelevel')
    >>> Student._make(unpack('<10sHHb', record))
    Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
    
    15 dengan presisi penuh. Jenis ini tidak didukung secara luas oleh kompiler C. pada mesin biasa, unsigned short dapat digunakan untuk penyimpanan, tetapi tidak untuk operasi matematika. Lihat halaman Wikipedia pada format floating-point setengah presisi untuk informasi lebih lanjut

Karakter format dapat didahului dengan jumlah pengulangan integral. Misalnya, format string

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_16 artinya persis sama dengan
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
17

Karakter spasi antar format diabaikan;

Untuk karakter format

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
18, hitungan ditafsirkan sebagai panjang byte, bukan hitungan berulang seperti karakter format lainnya; . Jika hitungan tidak diberikan, standarnya adalah 1. Untuk pengepakan, string dipotong atau diisi dengan byte nol yang sesuai untuk membuatnya pas. Untuk membongkar, objek byte yang dihasilkan selalu memiliki jumlah byte yang ditentukan. Sebagai kasus khusus,
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_21 berarti satu string kosong (sementara
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
22 berarti 0 karakter)

Saat mengemas nilai struct9 Menggunakan salah satu format integer (

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
24,
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
25,
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
26,
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
27, _________28,

Berubah di versi 3. 1. Dalam 3. 0, beberapa format bilangan bulat membungkus nilai di luar jangkauan dan sebagai gantinya dinaikkan.

Karakter format

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
38 mengkodekan "string Pascal", yang berarti string pendek dengan panjang variabel yang disimpan dalam jumlah byte tetap, diberikan oleh hitungan. Byte pertama yang disimpan adalah panjang string, atau 255, mana yang lebih kecil. Byte dari string mengikuti. Jika string yang diteruskan ke terlalu panjang (lebih panjang dari hitungan minus 1), hanya
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
40 byte terdepan dari string yang disimpan. Jika string lebih pendek dari
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_40, itu diisi dengan byte nol sehingga jumlah byte yang digunakan sama persis. Perhatikan bahwa untuk , karakter format
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_38 menggunakan
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
44 byte, tetapi string yang dikembalikan tidak akan pernah berisi lebih dari 255 byte

Untuk karakter format Struct2, nilai kembaliannya adalah salah satu atau. Saat mengemas, nilai kebenaran objek argumen digunakan. Baik 0 atau 1 dalam representasi bool asli atau standar akan dikemas, dan nilai bukan nol apa pun akan menjadi

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
46 saat membongkar

7. 1. 2. 3. Contoh

Catatan

Semua contoh mengasumsikan urutan, ukuran, dan penyelarasan byte asli dengan mesin big-endian

Contoh dasar pengepakan/pembongkaran tiga bilangan bulat

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
b'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

Bidang yang belum dibuka dapat diberi nama dengan menugaskannya ke variabel atau dengan membungkus hasilnya dalam tupel bernama

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)

Pengurutan karakter format mungkin berdampak pada ukuran karena bantalan yang diperlukan untuk memenuhi persyaratan penyelarasan berbeda

>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5

Format berikut

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_49 menetapkan dua pad byte di bagian akhir, dengan asumsi long disejajarkan pada batas 4-byte

>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'

Ini hanya berfungsi ketika ukuran dan perataan asli berlaku;

Lihat juga

Modul Penyimpanan biner yang dikemas dari data homogen. Modul Mengemas dan membongkar data XDR

7. 1. 3. Kelas

Modul ini juga mendefinisikan tipe berikut

kelas
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
3
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
54 ( format )

Kembalikan objek Struct baru yang menulis dan membaca data biner sesuai dengan format format string. Membuat objek Struct satu kali dan memanggil metodenya lebih efisien daripada memanggil fungsi dengan format yang sama karena string format hanya perlu dikompilasi satu kali

Objek Struct yang dikompilasi mendukung metode dan atribut berikut

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
6 ( v1, v2,. )

Identik dengan fungsinya, menggunakan format yang dikompilasi. (

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
58 akan sama. )

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
8 ( penyangga, offset, v1, v2,. )

Identik dengan fungsinya, menggunakan format yang dikompilasi

>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
0 ( penyangga )

Identik dengan fungsinya, menggunakan format yang dikompilasi. Ukuran buffer dalam byte harus sama

>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
4 ( buffer, offset=0 )

Identik dengan fungsinya, menggunakan format yang dikompilasi. Ukuran buffer dalam byte, minus offset, setidaknya harus

>>> pack('ci', b'*', 0x12131415)
b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
b'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
7 ( penyangga )

Identik dengan fungsinya, menggunakan format yang dikompilasi. Ukuran buffer dalam byte harus kelipatan

Baru di versi 3. 4

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_71

String format yang digunakan untuk membuat objek Struct ini

>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
_72

Ukuran struct yang dihitung (dan karenanya objek bytes yang dihasilkan oleh metode) sesuai dengan

Berapa byte int Python?

Agar aman, Python mengalokasikan sejumlah byte ruang dalam memori untuk setiap variabel bertipe integer normal, yang dikenal sebagai int dalam Python. Biasanya, bilangan bulat menempati empat byte , atau 32 bit.

Bagaimana Anda mengubah data menjadi byte dengan Python?

Python byte() function mengonversi objek menjadi objek yang diwakili oleh byte yang tidak dapat diubah dengan ukuran dan data tertentu. .
Sintaksis. byte(src, enc, err)
Parameter
Pengembalian. Byte objek tetap yang terdiri dari unicode 0-256 karakter sesuai dengan tipe src

Bisakah Anda memasukkan nilai int ke dalam variabel byte?

Tidak mungkin . Satu byte adalah 0 hingga 255. Int jauh lebih besar dari itu. Jadi, Anda dapat mengonversi int menjadi aliran byte, tetapi tidak menjadi byte.

Bagaimana cara mengubah hex int menjadi byte dengan Python?

Gunakan byte. fromhex() function untuk Mengonversi nilai Heksadesimal menjadi Byte dengan Python. fromHex() adalah metode kelas yang membuat byte sebagai objek dari string heksadesimal. Untuk dua string heksadesimal, satu byte diberikan dalam metode ini.