2012-03-27 30 views
6

Czytam w tagu id3, gdzie rozmiar każdej klatki jest określony w 3 bajtach. Jak byłbym w stanie wykorzystać tę wartość jako int?Jak czytasz w wartości wielkości 3 bajty jako liczbę całkowitą w C++?

+1

Co oznacza "czytanie"? Z pamięci? Z pliku? –

+1

W C możesz użyć czegoś, co nazywa się polem bitowym wpisanym jako int zajmującym 3 bajty = 3 * 8 = 24 bity. W C jest to oznaczone przez 'int int_3byte: 24' (wewnątrz struktury). Przypuszczam, że C++ ma równoważny mechanizm do tego. – phimuemue

+2

Proszę nie używać bitfielda. –

Odpowiedz

9

Czytaj każdy bajt, a następnie umieścić je razem w swojej int:

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

Upewnij się, aby wziąć pod uwagę endianness.

+0

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

+1

Nie ma znaczenia, są one takie same w tym przypadku. –

+0

Dobrze, dziękuję – carboncomputed

5

Przeczytaj bajtów indywidualnie, i umieścić je w odpowiednich miejscach w 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; 

Edycja: wydaje się, że korzysta z sieci ID3 (big-endian) kolejności bajtów - zmieniony kod pasujące.

+0

Zakłada się, że' char' jest unsigned ... (Również 'fgetc' zwraca' int'!) –

+0

@OliCharlesworth: fgetc zwraca int, ale jedynymi wartościami, które mogą być ujemne (jako int) są rzeczy takie jak EOF (którego ignoruję dla moment). –

+2

Ludzie C++ prawdopodobnie nienawidzą go za używanie 'fgetc()' w ogóle, ale jestem z Jerrym. –