Pergunta

esta questão , eu estou tentando ler em um cabeçalho tag ID3v2 e estou tendo dificuldade para descobrir como obter bytes individuais em python.

li pela primeira vez todos os bytes dez em uma string. Eu, então, quer para analisar os pedaços individuais de informação.

Eu posso pegar os dois caracteres número de versão no corda, mas então eu não tenho nenhuma idéia como tomar esses dois caracteres e obter um inteiro fora delas.

O pacote de struct parece ser o que eu quero, mas não posso fazê-lo funcionar.

Aqui está o meu código até-agora (eu sou muito novo para python btw ... para levá-lo fácil para mim):

def __init__(self, ten_byte_string):
        self.whole_string = ten_byte_string
        self.file_identifier = self.whole_string[:3]
        self.major_version = struct.pack('x', self.whole_string[3:4]) #this 
        self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
        self.flags = self.whole_string[5:6]
        self.len = self.whole_string[6:10]

Impressão de qualquer valor, exceto é, obviamente, uma porcaria, porque eles não estão formatados corretamente.

Foi útil?

Solução

Se você tem uma corda, com 2 bytes que você deseja interpretar como um inteiro de 16 bits, você pode fazê-lo:

>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)

Note que a> é para big-endian (a maior parte do número inteiro vem em primeiro lugar). Este é o formato ID3 tags de usar.

Para outros tamanhos de inteiro, você usa códigos de formato diferentes. por exemplo. "I" para um pouco inteiro assinado de 32. Consulte a ajuda (struct) para mais detalhes.

Você também pode descompactar vários elementos de uma só vez. por exemplo, para 2 calções sem sinal, seguido por um valor de 32 bits com sinal:

>>> a,b,c = struct.unpack('>HHi', some_string)

Indo pelo seu código, você está procurando (em ordem):

  • a 3 texto CHAR
  • 2 valores de byte simples (versão maior e menor)
  • a bandeiras variável 1 byte
  • uma quantidade comprimento de 32 bits

A cadeia de formato para isso seria:

ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)

Outras dicas

Por que escrever o seu próprio? (Supondo que você não fez check-out essas outras opções.) Há um par de opções lá fora, para ler na ID3 tag informações de MP3s em Python. Confira a minha resposta href="https://stackoverflow.com/questions/8948/accessing-mp3-meta-data-with-python#102285"> sobre a this questão .

Eu estou tentando ler em um cabeçalho ID3v2 tag

FWIW, há já um módulo para isso.

Eu ia recomendar o pacote struct mas depois você disse que tinha tentado. Tente isto:

self.major_version = struct.unpack('H', self.whole_string[3:5])

A função pack() convers Python tipos de dados para os bits e os bits convertidos função unpack() para tipos de dados Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top