#c
#c
Вопрос:
Этот вопрос может показаться вам глупым, ребята, но я новичок в C. Мне нужно преобразовать мой int * array в short * array. Вот мой пример кода:
#include <stdio.h>
#include <stdlib.h>
#define file_path "/app/diag/Sound/test_gen.wav"
int main()
{
long data_size;
data_size = get_file_size(file_path);
int *data = (int *) malloc(data_size * sizeof(int));
readPCM(data, 44100, 16, data_size);
return 0;
}
Теперь мне нужно преобразовать массив данных в короткий * массив. Как я могу это сделать? Пример кода был бы действительно заметным. Я знаю, как это сделать на Java. Ознакомьтесь с моим кодом ниже.
Я знаю, как это работает на Java. Посмотрите мой код для Java:
public static short[] encodeToSample(byte[] srcBuffer, int numBytes) {
byte[] tempBuffer = new byte[2];
int nSamples = numBytes / 2;
short[] samples = new short[nSamples]; // 16-bit signed value
for (int i = 0; i < nSamples; i ) {
tempBuffer[0] = srcBuffer[2 * i];
tempBuffer[1] = srcBuffer[2 * i 1];
samples[i] = bytesToShort(tempBuffer);
}
return samples;
}
public static short bytesToShort(byte [] buffer) {
ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.BIG_ENDIAN);
bb.put(buffer[0]);
bb.put(buffer[1]);
return bb.getShort(0);
}
Спасибо
Комментарии:
1. измените
int
ключевые слова наshort
. Что еще?2. Ну, я думаю, что это не сработает. потому что данные PCM не будут преобразованы просто путем приведения.
3. о, я понимаю … хорошо
4. Создайте новый массив и скопируйте элементы в цикле.
5. для тех, кто не знает Java, может помочь, если вы приведете несколько примеров ожидаемого результата для данного ввода
Ответ №1:
#include <stdio.h>
#include <stdlib.h>
#define file_path "/app/diag/Sound/test_gen.wav"
int main()
{
long data_size;
data_size = get_file_size(file_path);
int *data = (int *) malloc(data_size * sizeof(int));
short *data2 = (short*) malloc(2 * data_size * sizeof(short)); //notice the doubled size
readPCM(data, 44100, 16, data_size);
for(int i = 0; i < data_size; i )
{
data2[2 * i] = data[i] >> 16; // get the 16 most significant
data2[2 * i 1] = data[i] amp; 0xFFFF; //get the 16 least significant
}
free(data);
}
Комментарии:
1. Я понимаю, что вы предлагаете. По сути, он делает то же самое, что вы прокомментировали выше. Но я обновил свой вопрос. Проверьте это. Я знаю, как это сделать на Java. Но я не знаю, как это сделать в C. Причина в том, что преобразование массива int byte в short всегда будет составлять половину его первоначальной длины.
2. @SubbirRahman вы хотите разделить каждый int на 2 коротких?
3. Имейте в виду, что стандарт C не указывает, что
int
это в два раза большеshort
. Оба должны иметь ширину не менее 16 бит, а ширина первого должна быть не менее ширины последнего. Конечно, во многих системах ширина будет составлять 32 и 16 бит соответственно. Если полная переносимость не является серьезной проблемой, я бы не стал беспокоиться об этом.4. Ну, если бы у них были равные размеры, тогда ему, вероятно, не понадобилось бы преобразование, верно?
5. Low16short = data[i] amp; 0xFFFF