struct

struct - интСрпрСтация Π±Π°ΠΉΡ‚ΠΎΠ² ΠΊΠ°ΠΊ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ выполняСт прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями Python ΠΈ структурами C, прСдставлСнными ΠΊΠ°ΠΊ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠ»ΠΈ ΠΈΠ· сСтСвых ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, срСди Π΄Ρ€ΡƒΠ³ΠΈΡ… источников. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ строки Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ описаниС ΠΌΠ°ΠΊΠ΅Ρ‚Π° структур C ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ прСобразования Π²/ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Python.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ структуры C Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚Ρ‹ заполнСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ для задСйствованных Ρ‚ΠΈΠΏΠΎΠ² C; Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΈ распаковкС учитываСтся ΡΠΎΠΎΡΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Π°ΠΉΡ‚Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠΉ структуры Ρ‚ΠΎΡ‡Π½ΠΎ соотвСтствовали Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ΅ Π² памяти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры C. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ нСзависимыС ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ нСявныС Π±Π°ΠΉΡ‚Ρ‹ заполнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ стандартный Ρ€Π°Π·ΠΌΠ΅Ρ€ standard ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ вмСсто собствСнного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° native ΠΈ выравнивания: подробности см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅.

НСкоторыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ struct (ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Struct) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π±ΡƒΡ„Π΅Ρ€Π° buffer. Π­Ρ‚ΠΎ относится ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΡƒΡ„Π΅Ρ€ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ чтСния ΠΈΠ»ΠΈ записи ΠΈ чтСния. НаиболСС распространСнными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для этой Ρ†Π΅Π»ΠΈ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±Π°ΠΉΡ‚Ρ‹ bytes ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ массив bytearray, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ массив Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π±ΡƒΡ„Π΅Ρ€Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ/Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ копирования ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ΠœΠΎΠ΄ΡƒΠ»ΡŒ опрСдСляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • struct.error exception

  • struct.pack () - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

  • struct.pack_into ()

  • struct.unpack () - распаковываСт ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ

  • struct.unpack_from ()

  • struct.iter_unpack ()

  • struct.calcsize ()

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° - это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для указания ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΏΡ€ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ ΠΈ распаковкС Π΄Π°Π½Π½Ρ‹Ρ…. Они состоят ΠΈΠ· символов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚ΠΈΠΏ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ…/распаковываСмых Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы для управлСния порядком Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚ΠΈΠΏΡ‹ C прСдставлСны Π² собствСнном машинном Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΈ порядкС Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΈ нСобходимости Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Ρ‹ ΠΏΡƒΡ‚Π΅ΠΌ пропуска Π±Π°ΠΉΡ‚ΠΎΠ² Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π° (Π² соотвСтствии с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ компилятором C).

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ строки Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для указания порядка Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ выравнивания ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² соотвСтствии со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ:

Π‘ΠΈΠΌΠ²ΠΎΠ»

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ²

Π Π°Π·ΠΌΠ΅Ρ€

Π’Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅

@

собствСнный

собствСнный

собствСнный

=

собствСнный

стандартный

Π½Π΅Ρ‚

<

ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ (little-endian)

стандартный

Π½Π΅Ρ‚

>

прямой (big-endian)

стандартный

Π½Π΅Ρ‚

!

сСтСвой (Ρ€Π°Π²Π΅Π½ прямому)

стандартный

Π½Π΅Ρ‚

Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Ρ…, прСдполагаСтся '@'.

БобствСнный native порядок Π±Π°ΠΉΡ‚ΠΎΠ² - прямой ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ порядок Π±Π°ΠΉΡ‚ΠΎΠ², Π² зависимости ΠΎΡ‚ хост-систСмы. НапримСр, Intel x86 ΠΈ AMD64 (x86-64) ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ (little-endian)порядок Π±Π°ΠΉΡ‚ΠΎΠ²; Motorola 68000 ΠΈ PowerPC G5 ΠΈΠΌΠ΅ΡŽΡ‚ прямой (big-endian) порядок Π±Π°ΠΉΡ‚ΠΎΠ²; ARM ΠΈ Intel Itanium ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ порядок слСдования Π±Π°ΠΉΡ‚ΠΎΠ² (bi-endian). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ sys.byteorder для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ порядка Π±Π°ΠΉΡ‚ΠΎΠ² Π² вашСй систСмС.

БобствСнныС native Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ выраТСния sizeof компилятора C. Π­Ρ‚ΠΎ всСгда сочСтаСтся с собствСнным порядком Π±Π°ΠΉΡ‚ΠΎΠ².

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ standard Ρ€Π°Π·ΠΌΠ΅Ρ€ зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° символа; см. Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Β».

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ '@' ΠΈ '=': ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ собствСнный native порядок Π±Π°ΠΉΡ‚ΠΎΠ², Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ послСднСго стандартизированы.

Π€ΠΎΡ€ΠΌΠ° '!' доступна для Ρ‚Π΅Ρ… бСдняг, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ сСтСвой порядок Π±Π°ΠΉΡ‚ΠΎΠ² прямым ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ.

НСвозмоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅Ρ€ΠΎΠ΄Π½ΠΎΠΉ not-native порядок Π±Π°ΠΉΡ‚ΠΎΠ² (ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π·Π°ΠΌΠ΅Π½Π° Π±Π°ΠΉΡ‚ΠΎΠ²); ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ '<' ΠΈΠ»ΠΈ '>'.

  1. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ автоматичСски добавляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ структуры. Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ структуры Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ добавляСтся.

  2. ΠŸΡ€ΠΈ использовании нСстандартного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ выравнивания отступы Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ '<', '>', '=' ΠΈ '!'.

  3. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ€ΠΎΠ²Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ† структуры ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ выравнивания ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΊΠΎΠ΄ΠΎΠΌ для этого Ρ‚ΠΈΠΏΠ° с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ счСтчиком ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ². Π‘ΠΌ. ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями C ΠΈ Python Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, учитывая ΠΈΡ… Ρ‚ΠΈΠΏΡ‹. Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Β» относится ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ значСния Π² Π±Π°ΠΉΡ‚Π°Ρ… ΠΏΡ€ΠΈ использовании стандартного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°; Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° строка Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° начинаСтся с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· '<', '>', '!' ΠΈΠ»ΠΈ '='. ΠŸΡ€ΠΈ использовании собствСнного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ значСния зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Π€ΠΎΡ€ΠΌΠ°Ρ‚

Π’ΠΈΠΏ Π‘

Π’ΠΈΠΏ Python

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

x

pad byte

Π½Π΅Ρ‚ значСния

c

char

Π±Π°ΠΉΡ‚ с Π΄Π»ΠΈΠ½ΠΎΠΉ 1

1

b

signed char

integer

1

(1), (2)

B

unsigned byte

integer

1

(2)

?

_Bool

bool

1

(1)

h

short

integer

2

(2)

H

unsigned short

integer

2

(2)

i

int

integer

4

(2)

I

unsigned int

integer

4

(2)

l

long

integer

4

(2)

L

unsigned long

integer

4

(2)

q

long long

integer

8

(2)

Q

unsigned long long

integer

8

(2)

n

size_t

integer

(3)

N

size_t

integer

(3)

e

(6)

float

2

(4)

f

float

float

4

(4)

d

double

float

8

(4)

s

char [ ]

bytes

p

char [ ]

bytes

P

void *

integer

(5)

ИзмСнСно Π² вСрсии 3.3: Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² 'n' ΠΈ 'N'.

ИзмСнСно Π² вСрсии 3.6: Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° 'e'.

  1. Код прСобразования '?' соотвСтствуСт Ρ‚ΠΈΠΏΡƒ _Bool, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π² C99. Если этот Ρ‚ΠΈΠΏ нСдоступСн, ΠΎΠ½ модСлируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа char. Π’ стандартном Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ½ всСгда прСдставлСн ΠΎΠ΄Π½ΠΈΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ.

  2. ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Ρ†Π΅Π»ΠΎΠ΅ число с использованиСм любого ΠΈΠ· ΠΊΠΎΠ΄ΠΎΠ² прСобразования Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Ссли Π½Π΅Ρ†Π΅Π»ΠΎΠ΅ число ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ '__index__ ()', Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся для прСобразования Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ†Π΅Π»ΠΎΠ΅ число ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΎΠΉ. ИзмСнСно Π² вСрсии 3.2: использованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° '__index__ ()' для Π½Π΅Ρ†Π΅Π»Ρ‹Ρ… чисСл являСтся Π½ΠΎΠ²Ρ‹ΠΌ Π² вСрсии 3.2.

  3. ΠšΠΎΠ΄Ρ‹ прСобразования 'n' ΠΈ 'N' доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для исходного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа порядка Π±Π°ΠΉΡ‚ΠΎΠ² '@'). Для стандартного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ цСлочислСнный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, подходящий для вашСго прилоТСния.

  4. Для ΠΊΠΎΠ΄ΠΎΠ² прСобразования 'f', 'd' ΠΈ 'e' ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ прСдставлСниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ IEEE 754 binary32, binary64 ΠΈΠ»ΠΈ binary16 (для 'f', 'd' ΠΈΠ»ΠΈ 'e' соотвСтствСнно), нСзависимо ΠΎΡ‚ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ.

  5. Π‘ΠΈΠΌΠ²ΠΎΠ» Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° 'P' доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для собствСнного порядка Π±Π°ΠΉΡ‚ΠΎΠ² (Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа порядка Π±Π°ΠΉΡ‚ΠΎΠ² '@'). Π‘ΠΈΠΌΠ²ΠΎΠ» порядка Π±Π°ΠΉΡ‚ΠΎΠ² '=' Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ использованиС прямого ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ порядка Π±Π°ΠΉΡ‚ΠΎΠ² Π² зависимости ΠΎΡ‚ хост-систСмы. ΠœΠΎΠ΄ΡƒΠ»ΡŒ struct Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ это ΠΊΠ°ΠΊ собствСнный порядок, поэтому Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ 'P' нСдоступСн.

  6. Π’ΠΈΠΏ Β«ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π½ΠΎΠΉ точности» IEEE 754 binary16 Π±Ρ‹Π» Π²Π²Π΅Π΄Π΅Π½ Π² Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΡŽ 2008 Π³ΠΎΠ΄Π° стандарта IEEE 754. Он ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π±ΠΈΡ‚, 5-Π±ΠΈΡ‚Π½ΡƒΡŽ экспонСнту ΠΈ 11-Π±ΠΈΡ‚Π½ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ (с явно сохранСнными 10 Π±ΠΈΡ‚Π°ΠΌΠΈ) ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ числа ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 6.1e-05 Π΄ΠΎ 6.5e+04 с ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ ΡˆΠΈΡ€ΠΎΠΊΠΎ Π½Π΅ поддСрТиваСтся компиляторами C: Π½Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ машинС Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ сокращСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для хранСния, Π½ΠΎ Π½Π΅ для матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π‘ΠΌ. страницу Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π½ΠΎΠΉ точности для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ число ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ². НапримСр, строка Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° '4h' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ 'hhhh'.

ΠŸΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ; счСтчик ΠΈ Π΅Π³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².

Для символа Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° 's' счСтчик интСрпрСтируСтся ΠΊΠ°ΠΊ Π΄Π»ΠΈΠ½Π° Π±Π°ΠΉΡ‚ΠΎΠ², Π° Π½Π΅ ΠΊΠ°ΠΊ счСтчик ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ°ΠΊ для Π΄Ρ€ΡƒΠ³ΠΈΡ… символов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, '10s' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ 10-Π±Π°ΠΉΡ‚ΠΎΠ²ΡƒΡŽ строку, Π° '10c' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ 10 символов. Если счСтчик Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ Ρ€Π°Π²Π΅Π½ 1. Для ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ строка усСкаСтся ΠΈΠ»ΠΈ дополняСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° соотвСтствовала Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ. Для распаковки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ bytes всСгда ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ количСство Π±Π°ΠΉΡ‚ΠΎΠ². Как особый случай, '0s' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΏΡƒΡΡ‚ΡƒΡŽ строку (Π° '0c' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ 0 символов).

ΠŸΡ€ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ значСния x с использованиСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· цСлочислСнных Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'), Ссли x находится Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° для этого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ struct.error.

ИзмСнСно Π² вСрсии 3.1: Π² вСрсии 3.0 Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ цСлочислСнныС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ пСрСносили значСния, выходящиС Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ DeprecationWarning вмСсто struct.error.

Π‘ΠΈΠΌΠ²ΠΎΠ» Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° 'p' ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Β«Pascal stringΒ», ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΡƒΡŽ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ строку ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽΡΡ Π² фиксированном количСствС Π±Π°ΠΉΡ‚ΠΎΠ², опрСдСляСмом счСтчиком. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сохранСнный Π±Π°ΠΉΡ‚ - это Π΄Π»ΠΈΠ½Π° строки ΠΈΠ»ΠΈ 255, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ мСньшС. Π”Π°Π»Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π±Π°ΠΉΡ‚Ρ‹ строки. Если строка, пСрСданная Π² pack (), слишком длинная (Π΄Π»ΠΈΠ½Π½Π΅Π΅, Ρ‡Π΅ΠΌ count - 1), ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π΅Π΄ΡƒΡ‰ΠΈΠ΅ Π±Π°ΠΉΡ‚Ρ‹ count - 1 строки. Если строка ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ count - 1, ΠΎΠ½Π° дополняСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ использовалось Ρ€ΠΎΠ²Π½ΠΎ count Π±Π°ΠΉΡ‚ΠΎΠ² Π²ΠΎ всСх. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для unpack () символ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° 'p' потрСбляСт количСство Π±Π°ΠΉΡ‚ΠΎΠ², Π½ΠΎ возвращаСмая строка Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ большС 255 Π±Π°ΠΉΡ‚ΠΎΠ².

Для символ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° '?', Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - True ΠΈΠ»ΠΈ False. ΠŸΡ€ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π›ΠΈΠ±ΠΎ 0, Π»ΠΈΠ±ΠΎ 1 Π² собствСнном ΠΈΠ»ΠΈ стандартном прСдставлСнии bool Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Ρ‹, ΠΈ любоС Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ True ΠΏΡ€ΠΈ распаковкС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ собствСнный native порядок Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ с машиной с прямым (big-endian) порядком Π±Π°ΠΉΡ‚ΠΎΠ².

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ/распаковки Ρ‚Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл:

>>> 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

Распакованным полям ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π°, Π½Π°Π·Π½Π°Ρ‡ΠΈΠ² ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ:

>>> 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)

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ символов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для удовлСтворСния Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΡŽ, отличаСтся:

>>> 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

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ 'llh0l' опрСдСляСт Π΄Π²Π° Π±Π°ΠΉΡ‚Π° заполнСния Π² ΠΊΠΎΠ½Ρ†Π΅, прСдполагая, Ρ‡Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ значСния Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Ρ‹ ΠΏΠΎ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ:

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

Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ собствСнный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅; стандартный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ совмСщСния.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅:

  • ΠΌΠΎΠ΄ΡƒΠ»ΡŒ array - ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

  • ΠΌΠΎΠ΄ΡƒΠ»ΡŒ xdrlib - ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈ распаковка Π΄Π°Π½Π½Ρ‹Ρ… XDR

ΠšΠ»Π°ΡΡΡ‹

ΠœΠΎΠ΄ΡƒΠ»ΡŒ struct Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ:

  • struct.Struct class

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Struct ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹:

  • pack ()

  • pack_into ()

  • unpack ()

  • unpack_from ()

  • iter_unpack ()

  • format

  • size

Last updated

Was this helpful?