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

Введение

Примеры

  • 0

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

     from struct import pack
    
    print(pack('I3c', 123, b'a', b'b', b'c'))  # b'{\x00\x00\x00abc' 
  • 0

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

     from struct import unpack
    
    print(unpack('I3c', b'{\x00\x00\x00abc'))  # (123, b'a', b'b', b'c') 
  • 0

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

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

    Функция 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»

Синтаксис

Параметры

Примечания