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++?
Odpowiedz
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.
'+' lub '|'? [..] – Muggen
Nie ma znaczenia, są one takie same w tym przypadku. –
Dobrze, dziękuję – carboncomputed
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.
Zakłada się, że' char' jest unsigned ... (Również 'fgetc' zwraca' int'!) –
@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). –
Ludzie C++ prawdopodobnie nienawidzą go za używanie 'fgetc()' w ogóle, ale jestem z Jerrym. –
Co oznacza "czytanie"? Z pamięci? Z pliku? –
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
Proszę nie używać bitfielda. –