Python Language
Binära data
Sök…
Syntax
- paket (fmt, v1, v2, ...)
- packa upp (fmt, buffert)
Formatera en lista med värden i ett byteobjekt
from struct import pack
print(pack('I3c', 123, b'a', b'b', b'c')) # b'{\x00\x00\x00abc'
Packa upp ett byteobjekt enligt en formatsträng
from struct import unpack
print(unpack('I3c', b'{\x00\x00\x00abc')) # (123, b'a', b'b', b'c')
Packa en struktur
Modulen " strukt " ger möjlighet att packa pythonobjekt som en sammanhängande bit av bitar eller sprida en bit bitar till pythonstrukturer.
Packfunktionen tar en formatsträng och ett eller flera argument och returnerar en binär sträng. Det ser mycket ut som att du formaterar en sträng förutom att utgången inte är en sträng utan en bit bit.
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)
Produktion:
Native byteorder: liten Byte-bit: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05' Byte-bit packad: (3, 4, 5) Byte-bit: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05 \ x00'
Du kan använda nätverksbyteorder med data som mottas från nätverk eller pakedata för att skicka den till nätverket.
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)
Produktion:
Byte-bitens ursprunglig byteordning: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00'
Byte-bitarbetsnätverk för byte: '\ x00 \ x03 \ x00 \ x04 \ x00 \ x05'
Du kan optimera genom att undvika omkostnaderna för att tilldela en ny buffert genom att tillhandahålla en buffert som skapades tidigare.
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)
Produktion:
Bytebit: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00'
Bytebit: '\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00'