Python struct pack, unpack

O módulo struct do Python é capaz de realizar conversões entre os valores do Python e as estruturas C, que são representadas como Strings do Python.

Módulo Struct do Python

  • O módulo struct do Python pode ser usado para manipular dados binários armazenados em arquivos, bancos de dados ou de conexões de rede, etc.
  • Ele usa Strings de formato como descrições compactas da estrutura das estruturas C e da conversão pretendida para/de valores do Python.

Funções do Módulo Struct do Python

Há cinco funções importantes no módulo struct – pack(), unpack(), calcsize(), pack_into() e unpack_from(). Em todas essas funções, devemos fornecer o formato dos dados a serem convertidos em binário. Alguns dos caracteres de formato populares são:

?: boolean
h: short
l: long
i: int
f: float
q: long long int

Você pode obter a lista completa de caracteres de formato aqui. Vamos começar a analisar as funções do módulo struct uma por uma.

Python struct.pack()

Esta função empacota uma lista de valores em uma representação de String do tipo especificado. Os argumentos devem corresponder exatamente aos valores necessários pelo formato. Vamos dar uma olhada rápida no exemplo do struct pack():

import struct

var = struct.pack('hhl', 5, 10, 15)
print(var)
 
var = struct.pack('iii', 10, 20, 30)
print(var)

Quando executamos este script, obtemos a seguinte representação: Note que ‘b’ na saída significa binário.

Python struct.unpack()

Esta função desempacota o valor empacotado para sua representação original com o formato especificado. Esta função sempre retorna uma tupla, mesmo se houver apenas um elemento. Vamos dar uma olhada rápida no exemplo da função struct unpack():

import struct
var = struct.pack('hhl', 5, 10, 15)
print(var)
print(struct.unpack('hhl', var))

Ao executarmos este script, obtemos de volta nossa representação original: Claramente, devemos informar ao interpretador Python o formato que precisamos para desempacotar os valores.

Python struct calcsize()

Esta função calcula e retorna o tamanho da representação da string de uma estrutura com um formato dado. O tamanho é calculado em bytes. Vamos dar uma olhada rápida em um trecho de código de exemplo:

import struct
 
var = struct.pack('hhl', 5, 10, 15)
print(var)
print("Size of String representation is {}.".format(struct.calcsize('hhl')))

Ao executarmos este script, obtemos a seguinte representação:

Python struct pack_into(), unpack_from()

Essas funções nos permitem empacotar os valores em um buffer de string e desempacotar de um buffer de string. Essas funções foram introduzidas na versão 2.5.

import struct
# ctypes é importado para criar um buffer de string
import ctypes

# Como mostrado no exemplo anterior
size = struct.calcsize('hhl')
print(size)

# O buffer 'buff' é criado a partir do ctypes
buff = ctypes.create_string_buffer(siz)

# struct.pack_into() empacota dados em buff e não retorna nenhum valor
# struct.unpack_from() desempacota dados de buff, retorna uma tupla de valores
print(struct.pack_into('hhl', buff, 0, 5, 10, 15))
print(struct.unpack_from('hhl', buff, 0))

Quando executamos este script, obtemos a seguinte representação: Isso é tudo para uma breve introdução ao módulo struct do Python.

Source:
https://www.digitalocean.com/community/tutorials/python-struct-pack-unpack