Компиляция массива char с нулевыми терминаторами между ними - PullRequest
1 голос
/ 11 декабря 2011

Я пытаюсь создать небольшую утилиту 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 без завершения строки?

Извините, если это звучит странно. Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Нулевые терминаторы будут соблюдаться только строковыми функциями, поэтому, если вы знаете размер строк, которые вы читаете и т. Д., Все будет в порядке - вы уверены, что используете memcpy, а не strcpy? Я знаю, что глупо спрашивать, учитывая то, что вы опубликовали, но memcpy не должен останавливаться на нулевом терминаторе.

Я бы предположил, что iFrameSize на самом деле не соответствует ожидаемому значению, и именно в этом и заключается проблема


1 голос
/ 11 декабря 2011

Вы можете хранить данные, которые вам нравятся, в массиве C.Проблема заключается в том, что многие функции времени выполнения C, которые итеративно работают со строками, распознают первый '\0' в массиве как символ завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...