Я пытаюсь создать небольшую утилиту C, которая читает тег MP3 из файла и отображает его. Я пытаюсь сделать его как можно более эффективным, поэтому я делаю все массивы символов, в которых хранятся имя, название и т. Д., Динамическими, чтобы они измерялись во время выполнения. Я нахожу размер каждого «фрейма» (фрейм: имя, заголовок и т. Д.) В заголовке MP3 ID3.
Сначала я начинаю с названия песни. Буфер файлов MP3, который я загрузил с помощью операции fopen и поместил в буфер символов, выглядит следующим образом:
T|0|I|0|T|0|I|0|l|0|E,
все в гексе, конечно. Как вы можете видеть, между буквами заголовка есть нули, то есть в C, что означает терминатор строки при попытке сохранить в массиве символов.
Я пытаюсь сделать следующее:
memcpy( bBuffFirstFrame, &bBuffTag[0x0A+10], iFrameSize );
Где bBuffTag - это место, где находится вся информация заголовка ID3.
Читая документацию, он говорит, что memcpy должен хранить все из исходного буфера, включая нулевые терминаторы. Однако массив char, который я создаю (bBuffFirstFrame), хранит только первый байт и завершается из-за нулевого терминатора. Таким образом, вместо сохранения названия песни «N | 0 | A | 0 | M | 0 | E» (0 - ноль), в нем хранится только N.
bBuffFirstFrame определяется как:
bBuffFirstFrame = ( unsigned char* ) malloc( iFrameSize );
Итак, мой первый вопрос: это лучший способ даже подойти к этой проблеме? Должен ли я использовать malloc для создания динамических массивов или просто создать массив, который действительно большой для каждого кадра? Например:
bBuffFirstFrame[10000]?
Как вы, наверное, знаете, название песни меняется с каждым MP3. Еще одна причина, по которой я не хочу создавать предварительно определенный массив размеров, заключается в том, что это может вызвать переполнение буфера для действительно большого имени песни.
Последний вопрос, есть ли способ хранить нулевые терминаторы внутри массива char без завершения строки?
Извините, если это звучит странно. Спасибо!