Szukaj…


Składnia

  • pack (fmt, v1, v2, ...)
  • rozpakuj (fmt, bufor)

Sformatuj listę wartości w obiekcie bajtowym

from struct import pack

print(pack('I3c', 123, b'a', b'b', b'c'))  # b'{\x00\x00\x00abc'

Rozpakuj obiekt bajtu zgodnie z ciągiem formatu

from struct import unpack

print(unpack('I3c', b'{\x00\x00\x00abc'))  # (123, b'a', b'b', b'c')

Pakowanie struktury

Moduł „ struct ” umożliwia pakowanie obiektów Pythona jako ciągłego fragmentu bajtów lub rozbijanie fragmentu bajtów na struktury Pythona.

Funkcja pack pobiera ciąg formatu i jeden lub więcej argumentów i zwraca ciąg binarny. Wygląda to bardzo podobnie do formatowania łańcucha, z tym że dane wyjściowe nie są łańcuchem, ale kawałkiem bajtów.

import struct
import sys
print "Native byteorder: ", sys.byteorder
# If no byteorder is specified, native byteorder is used
buffer = struct.pack("ihb", 3, 4, 5)
print "Byte chunk: ", repr(buffer)
print "Byte chunk unpacked: ", struct.unpack("ihb", buffer)
# Last element as unsigned short instead of unsigned char ( 2 Bytes)
buffer = struct.pack("ihh", 3, 4, 5)
print "Byte chunk: ", repr(buffer)

Wynik:

Natywny bajt: mały bajt: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05' Kawałek bajtu rozpakowany: (3, 4, 5) Kawałek bajtu: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05 \ x00 ”

Możesz użyć sieciowej kolejności bajtów z danymi otrzymanymi z sieci lub spakować dane, aby wysłać je do sieci.

import struct
# If no byteorder is specified, native byteorder is used
buffer = struct.pack("hhh", 3, 4, 5)
print "Byte chunk native byte order: ", repr(buffer)
buffer = struct.pack("!hhh", 3, 4, 5)
print "Byte chunk network byte order: ", repr(buffer)

Wynik:

Kolejność bajtów natywnej porcji: „\ x03 \ x00 \ x04 \ x00 \ x05 \ x00”

Kolejność bajtów w sieci fragmentów: „\ x00 \ x03 \ x00 \ x04 \ x00 \ x05”

Można zoptymalizować, unikając narzutu związanego z przydzielaniem nowego bufora, udostępniając bufor, który został wcześniej utworzony.

import struct
from ctypes import create_string_buffer
bufferVar = create_string_buffer(8)
bufferVar2 = create_string_buffer(8)
# We use a buffer that has already been created
# provide format, buffer, offset and data
struct.pack_into("hhh", bufferVar, 0, 3, 4, 5)
print "Byte chunk: ", repr(bufferVar.raw)
struct.pack_into("hhh", bufferVar2, 2, 3, 4, 5)
print "Byte chunk: ", repr(bufferVar2.raw)

Wynik:

Fragment bajtu: „\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00”

Fragment bajtu: „\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00”



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow