representação binária em Python e mantendo zeros à esquerda

5

Eu queria usar a biblioteca Python base64 para codificar uma seqüência de dígitos binários na base 64. Seria possível fazer isso sem converter em uma string? Se não, qual é a melhor maneira de fazê-lo, assumindo que minha string de 1/0 dígitos pode não ser um múltiplo inteiro de 8, pode até ser um número ímpar.

Além disso, tenho a seguinte pergunta: é possível atribuir uma string binária específica a uma variável? Por exemplo,

x = 0b00010101010
y = 0b1110000  

Eu quero x para manter os três zeros iniciais, e gostaria de poder concatenar estes para obter

z = 0b000101010101110000
    
por user60143 26.07.2012 / 01:55
fonte

2 respostas

3

No Python, a notação de representação binária 0b é apenas outra maneira de gravar inteiros. Portanto, não há diferença, por exemplo, entre 0b11 e 0b0011 - ambos representam o inteiro 3 .

Além disso, a codificação base64 é projetada para dados de entrada em grupos de 8 bits. A codificação é projetada para que o decodificador possa determinar exatamente o número de bytes que foram usados nos dados originais. No entanto, essa granularidade se estende apenas a grupos de 8 bits e não se estende ao nível de bits real.

Uma abordagem pode ser codificar seus dados com o primeiro byte representando o número de bits e, em seguida, os bytes a seguir representando os próprios bits. Seu decodificador pode usar essa informação para extrair o número exato de bits que você armazenou originalmente (com zeros à esquerda ou à direita, se quiser).

    
por 26.07.2012 / 02:25
fonte
1

Tanto x como y mantêm valores inteiros, você apenas escolhe usar 0b literais binários para defini-los.

Se você quiser combinar os dois em z , poderá fazer isso facilmente usando uma operação de mudança e operações bitwise binárias :

>>> x = 0b00010101010
>>> y = 0b1110000
>>> z = (x << 7) | y
>>> bin(z)
'0b101010101110000'

Observe que o Python não controla quantos bits de precisão você deseja manter em tais valores; você definiu y com 7 bits de informação, então tive que deslocar x para a esquerda 7 vezes para liberar espaço para y . Você teria que rastrear essas informações por conta própria.

Seu próximo problema é representar dados como base64, pois esse formato exige que você forneça apenas bytes. São pedaços de 8 bits de dados binários. Isso significa que você terá que alinhar seus bits aos limites de 8 bits e transformá-los em bytes (por exemplo, strings). Você não será capaz de contornar isso, eu tenho medo.

Eu usaria o % módulostruct para isso, ele permite que você coloque números inteiros e outros dados tipos em bytes com facilidade:

>>> import struct
>>> struct.pack('>H', x)
'\x00\xaa'
>>> struct.pack('>H', x).encode('base64')
'AKo=\n'

No exemplo acima, eu empacotei a variávelx de 11-bits% como curta não assinada (usando o formato C padrão little-endian), resultando em 2 bytes de informação, então codifiquei isso para base64.

O inverso requer a decodificação de base64, depois uma operação de descompactação:

>>> foo = struct.unpack('>H', 'AKo=\n'.decode('base64'))[0]
>>> bin(foo)
'0b10101010'

Novamente, o Python não rastreia quantos bits de informação são importantes para você, você terá que rastrear isso explicitamente.

    
por 26.07.2012 / 09:50
fonte