C int*数组到short*数组的转换

C int*数组到short*数组的转换,c,C,这个问题对你们来说可能很傻,但我是C语言的新手。我需要将我的int*数组转换为short*数组。以下是我的示例代码: #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 *

这个问题对你们来说可能很傻,但我是C语言的新手。我需要将我的int*数组转换为short*数组。以下是我的示例代码:

#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;
}
#包括
#包括
#定义文件路径“/app/diag/Sound/test\u gen.wav”
int main()
{
长数据量;
数据大小=获取文件大小(文件路径);
int*data=(int*)malloc(data_size*sizeof(int));
readPCM(数据,44100,16,数据大小);
返回0;
}
现在我需要将数据数组转换为short*数组。我该怎么做?示例代码将非常值得欣赏。我知道如何用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);
}
public static short[]encodeToSample(字节[]srcBuffer,int numBytes){
字节[]临时缓冲区=新字节[2];
int nSamples=numBytes/2;
short[]samples=新的short[nSamples];//16位有符号值
对于(int i=0;i
谢谢

#包括
#包括
#定义文件路径“/app/diag/Sound/test\u gen.wav”
int main()
{
长数据量;
数据大小=获取文件大小(文件路径);
int*data=(int*)malloc(data_size*sizeof(int));
short*data2=(short*)malloc(2*data_size*sizeof(short));//注意大小加倍了
readPCM(数据,44100,16,数据大小);
对于(int i=0;i>16;//获取16个最高有效值
data2[2*i+1]=data[i]&0xFFFF;//获取16个最低有效值
}
免费(数据);
}

int
关键字更改为
short
。还有什么?我想那是行不通的。因为PCM数据不能通过强制转换来转换。哦,我明白了。。。OK创建一个新数组并复制循环中的元素。对于那些不懂Java的人来说,如果您给出一些给定Input的预期输出示例,可能会有所帮助。我看看您的建议。它基本上是在做你上面评论过的事情。但我已经更新了我的问题。过来看。我知道如何用Java来做。但我不知道如何在C中实现。原因是int字节数组到short的转换将始终是其原始长度的一半。@SubbirRahman您想将每个int拆分为2个short吗?好的,我已经更新了。试试这个,记住C标准没有规定
int
short
的两倍大。两者的宽度都要求至少为16位,前者必须至少与后者相同宽。当然,在许多系统上,宽度分别为32位和16位。如果完全的可移植性不是一个大问题,我也不会担心。Low16short=data[I]&0xFFFF
#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] & 0xFFFF; //get the 16 least significant
  }
  free(data);
}