int * преобразование массива в короткий * преобразование массива

#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