2012-03-27 12 views
6

Sto leggendo un tag ID3 in cui la dimensione di ciascun frame è specificata in 3 byte. Come potrei essere in grado di utilizzare questo valore come un int?Come si legge in un valore di dimensione di 3 byte come numero intero in C++?

+1

Cosa significa "lettura"? Dalla memoria? Da un file? –

+1

In C è possibile utilizzare qualcosa chiamato campo bit digitato come int che occupa 3 byte = 3 * 8 = 24 bit. In C, questo è denotato da 'int int_3byte: 24' (all'interno di una struct). Suppongo che C++ abbia un meccanismo equivalente per questo. – phimuemue

+2

Si prega di non utilizzare un campo bit. –

risposta

9

leggere ogni byte e poi metterli insieme nel vostro int:

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

Assicurati di prendere in considerazione endianness.

+0

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

+1

Non importa, sono uguali in questo caso. –

+0

Eccellente, grazie – carboncomputed

5

Leggi i byte in individualmente, e metterli nel posto giusto in 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; 

Edit: sembra che ID3 utilizza ordine di byte di rete (big-endian) - ha cambiato il codice da abbinare.

+0

Questo presuppone che' char' sia unsigned ... (Inoltre, 'fgetc' restituisce un' int'!) –

+0

@OliCharlesworth: fgetc restituisce un int, ma gli unici valori che possono essere negativi (come un int) sono cose come EOF (che sto ignorando per il momento). –

+2

Probabilmente il popolo C++ lo detesta per l'uso di 'fgetc()', ma io sono con Jerry. –