Формат файла RIFF Wave: значения FourCC и HEX-преобразование
Контекст: я разбираю файлы Riff/Wave. Есть документация, идентифицирующая значения FourCC внутри фрагментов Riff. Вот более важные фрагменты для волновых файлов.
FourCC ID для двух отдельных.wav-блоков:
Chunk ID "fmt " (0x666D7420)
Chunk ID "data" (0x64617461)
Итак, эти значения fmt должны быть равны:
string "fmt "
Hex "666D7420"
int "1718449184"
И эти значения данных должны быть равны:
string "data"
Hex "64617461"
int "1684108385"
Теперь, когда я читаю действительные файлы.wav, fmtChunkID fmt int для FourCC всегда имеет вид:
fmt int:
int "544501094"
И данные int всегда есть:
data int:
int "1635017060"
Вопрос: Почему задокументированное значение Hex не совпадает с int, которое я возвращаю из потока? Я предполагаю, что не понимаю кое-что о преобразовании Hex в Int.
Дополнительно: я нашел в сети код парсера.wav с подозрительным значением fmt "1718449184". Но я нахожу больше со значением fmt "544501094". Наконец, выполните поиск в Google по запросу "1718449184 AND 544501094"; ничего такого.
Спасибо вам за помощь.
1 ответ
Endian. См. 0x20746d66 в десятичном виде. (0x20746d66 - это инверсия байтов 0x666d7420.)
В форматах файлов каждый байт должен быть в правильном месте. Если вы случайно читаете их в и из памяти, в зависимости от того, какой у вас процессор и формат файла, вы можете поменять порядок байтов.
Читайте о "Big Endian" и "Little Endian". Некоторые расскажут об этом очень подробно, но на самом деле это очень просто и важно понять, если вы когда-нибудь имели дело с форматами файлов, сетевым трафиком, взаимодействием с оборудованием и многими другими местами.