Документация по Python

Двоичные (бинарные) данные в Python

В: Документация по Python

Введение

Примеры

Отформатировать список значений в байтовый объект

 from struct import pack

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

Распаковать объект байта в соответствии со строкой формата

 from struct import unpack

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

Упаковка структуры

Модуль «структура» предоставляет возможность для упаковки объектов питона как непрерывный кусок байт или лукавят кусок байт питона структуры.

Функция pack принимает строку формата и один или несколько аргументов и возвращает двоичную строку. Это выглядит очень похоже на то, что вы форматируете строку, за исключением того, что выводом является не строка, а кусок байтов.

 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)
 

Выход:

Собственный метеородер: маленький байтный чанк: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05' Байтный чанк распакован: (3, 4, 5) Байтный чанк: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05 \ x00'

Вы можете использовать сетевой порядок байтов с данными, полученными из сети, или данные пакетов для отправки их в сеть.

 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)
 

Выход:

Собственный порядок байтов в чанках: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00'

Порядок байтов в сети: «\ x00 \ x03 \ x00 \ x04 \ x00 \ x05»

Вы можете оптимизировать, избегая затрат на выделение нового буфера, предоставляя буфер, созданный ранее.

 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)
 

Выход:

Байт: «\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00»

Байт: «\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00»

Синтаксис

Параметры

Примечания

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.