2012-03-27 7 views
6

Estoy leyendo en una etiqueta id3 donde el tamaño de cada cuadro se especifica en 3 bytes. ¿Cómo podría utilizar este valor como int?¿Cómo se lee en un valor de tamaño de 3 bytes como un entero en C++?

+1

¿Qué significa "lectura"? ¿De memoria? ¿De un archivo? –

+1

En C, podría utilizar algo llamado campo de bit tipeado como int ocupando 3 bytes = 3 * 8 = 24 bits. En C, esto se denota por 'int int_3byte: 24' (dentro de una estructura). Supongo que C++ tiene un mecanismo equivalente para esto. – phimuemue

+2

Por favor, no use un campo de bits. –

Respuesta

9

Leer cada byte y luego unirlas en su int:

int id3 = byte0 + (byte1 << 8) + (byte2 << 16); 

Asegúrese de tomar en cuenta endianness.

+0

'+' o '|'? [..] – Muggen

+1

No importa, son lo mismo en este caso. –

+0

Excelente, gracias – carboncomputed

5

Leer los bytes en forma individual, y los pusieron en los lugares correctos en un int:

int value = 0; 

unsigned char byte1 = fgetc(ID3file); 
unsigned char byte2 = fgetc(ID3file); 
unsigned char byte3 = fgetc(ID3file); 

value = (byte1 << 16) | (byte2 << 8) | byte3; 

Editar: parece que ID3 utiliza el orden de bytes de red (big-endian) - código para que coincida cambiado.

+0

Esto supone que' char' es unsigned ... (Además, 'fgetc' devuelve un' int'!) –

+0

@OliCharlesworth: fgetc devuelve un int, pero los únicos valores que pueden ser negativos (como un int) son cosas como EOF (que estoy ignorando para el momento). –

+2

La gente de C++ probablemente lo odia por usar 'fgetc()', pero estoy con Jerry. –

Cuestiones relacionadas