2012-03-27 53 views
6

Tôi đang đọc trong thẻ id3 có kích thước của mỗi khung được chỉ định bằng 3 byte. Làm thế nào tôi có thể sử dụng giá trị này như một int?Làm thế nào để bạn đọc trong một giá trị kích thước 3 byte như một số nguyên trong c + +?

+1

"đọc" nghĩa là gì? Từ ký ức? Từ một tập tin? –

+1

Trong C bạn có thể sử dụng một cái gì đó gọi là một lĩnh vực bit gõ như int chiếm 3 byte = 3 * 8 = 24 bit. Trong C, điều này được biểu thị bằng 'int int_3byte: 24' (bên trong một cấu trúc). Tôi cho rằng C++ có một cơ chế tương đương cho việc này. – phimuemue

+2

Vui lòng không sử dụng bitfield. –

Trả lời

9

Đọc mỗi byte và sau đó đặt chúng lại với nhau thành int của bạn:

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

Hãy chắc chắn để có endianness vào tài khoản.

+0

'+' hoặc '|'? [..] – Muggen

+1

Không quan trọng, chúng giống nhau trong trường hợp này. –

+0

Tuyệt vời, Cảm ơn bạn – carboncomputed

5

Đọc byte trong cá nhân, và đặt chúng vào những nơi đúng trong một 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: có vẻ như ID3 sử dụng mạng (lớn-endian) thứ tự byte - thay đổi mã để phù hợp.

+0

Giả định rằng' char' là unsigned ... (Ngoài ra, 'fgetc' trả về' int'!) –

+0

@OliCharlesworth: fgetc trả về một int, nhưng các giá trị duy nhất có thể âm (như int) là những thứ như EOF (mà tôi bỏ qua khoảnh khắc). –

+2

Người C++ có thể ghét nó vì sử dụng 'fgetc()', nhưng tôi có Jerry. –

Các vấn đề liên quan