Pregunta

Similar a esta pregunta, estoy tratando de leo en un encabezado de etiqueta ID3v2 y tengo problemas para descubrir cómo obtener bytes individuales en python.

Primero leí los diez bytes en una cadena. Luego quiero analizar los datos individuales.

Puedo tomar los dos caracteres del número de versión en la cadena, pero no tengo idea de cómo tomar esos dos caracteres y obtener un número entero de ellos.

El paquete de estructura parece ser lo que quiero, pero no puedo hacer que funcione.

Aquí está mi código hasta ahora (soy muy nuevo en python por cierto ... así que tómalo con calma):

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]

Imprimir cualquier valor, excepto obviamente, es una porquería porque no están formateados correctamente.

¿Fue útil?

Solución

Si tiene una cadena, con 2 bytes que desea interpretar como un entero de 16 bits, puede hacerlo:

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

Tenga en cuenta que el > es para big-endian (la mayor parte del entero es lo primero). Este es el formato que usan las etiquetas id3.

Para otros tamaños de enteros, utiliza diferentes códigos de formato. p.ej. " i " para un entero de 32 bits con signo. Consulte la ayuda (estructura) para más detalles.

También puede descomprimir varios elementos a la vez. por ejemplo, para 2 cortos sin signo, seguidos de un valor de 32 bits con signo:

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

Según su código, está buscando (en orden):

  • una cadena de 3 caracteres
  • 2 valores de un solo byte (versión mayor y menor)
  • una variable de banderas de 1 byte
  • una cantidad de 32 bits de longitud

La cadena de formato para esto sería:

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

Otros consejos

¿Por qué escribir el tuyo? (Suponiendo que no haya verificado estas otras opciones). Hay un par de opciones para leer en la información de etiqueta ID3 de MP3 en Python. Consulte mi respuesta en esta pregunta.

  

Estoy intentando leer en un encabezado de etiqueta ID3v2

FWIW, hay ya hay un módulo para esto.

Iba a recomendar el paquete struct pero luego dijiste que lo habías probado. Prueba esto:

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

La función pack () convierte los tipos de datos de Python en bits, y la función unpack () convierte bits en tipos de datos de Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top