Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从uint16到int16的铸造和转换_C_Casting_Buffer_Shift - Fatal编程技术网

C 从uint16到int16的铸造和转换

C 从uint16到int16的铸造和转换,c,casting,buffer,shift,C,Casting,Buffer,Shift,我有一个关于铸造和转移的问题。我试图将数组中的两个uint8\u t元素作为单个有符号元素存储在int16\u t类型的数组中。然而,我的结果是不正确的,我不知道为什么 我有以下代码: uint8_t buffer[BUFFER_SIZE]; int16_t mp3_stereo_buffer[BUFFER_SIZE]; for (i = 0; i < BUFFER_SIZE; i += 2) { mp3_stereo_buffer[i] = ((uint16_t)buffer[

我有一个关于铸造和转移的问题。我试图将数组中的两个
uint8\u t
元素作为单个有符号元素存储在
int16\u t
类型的数组中。然而,我的结果是不正确的,我不知道为什么

我有以下代码:

uint8_t buffer[BUFFER_SIZE];
int16_t mp3_stereo_buffer[BUFFER_SIZE];

for (i = 0; i < BUFFER_SIZE; i += 2) {
    mp3_stereo_buffer[i] = ((uint16_t)buffer[i] << 8) | ((uint16_t)buffer[i + 1]);
}
uint8\u t缓冲区[缓冲区大小];
int16_t mp3_立体声_缓冲区[缓冲区大小];
对于(i=0;imp3立体声缓冲区[i]=((uint16\u t)缓冲区[i]首先,您可以将N
uint8\u t
打包到N/2
uint16\u t
元素中

uint8_t buffer[BUFFER_SIZE];
uint16_t mp3_stereo_buffer[BUFFER_SIZE / 2];
然后你需要知道你的数据是小端还是大端

对于little endian:

for (i = 0; i < BUFFER_SIZE / 2; i++) {
  mp3_stereo_buffer[i] = (uint16_t) (buffer[i*2] | (buffer[i*2+1] << 8));
}
for (i = 0; i < BUFFER_SIZE / 2; i++) {
  mp3_stereo_buffer[i] = (uint16_t) ((buffer[i*2] << 8) | buffer[i*2+1]);
}
for(i=0;i#定义小的(ENDIAN)
int main()
{
uint8_t缓冲区[4]={0x15,0xff,0x63,0xee};
int16_t mp3_立体声_缓冲区[2];
对于(int i=0;i<2;i+=1){
mp3立体声缓冲区[i]=((int16_t*)缓冲区)[i];
#伊夫迪夫·小恩迪安

mp3_立体声_缓冲区[i]=(mp3_立体声_缓冲区[i]>>8&0x00ff)|(mp3_立体声_缓冲区[i]如果
buffer
的两个元素都是
uint8\u t
mp3\u stereou\u buffer
应该是
uint16\u t
。对于
int16\u t
,最高有效位是符号位,设置后会产生一个负数。@FiddlingBits所以如果我将mp3\u stereou buffer更改为uint16\u t,它不会保持无符号?@sam代码非常有限,因此很难准确理解您的需求和约束是什么。不过,为了回答您的问题,C将始终将
uint16\t
变量解释为那样,当然,除非您强制转换它。
#define LITTLE_ENDIAN
int main()
{
uint8_t buffer[4]={0x15,0xff,0x63,0xee};
int16_t mp3_stereo_buffer[2];

for (int i = 0; i < 2; i += 1) {
    mp3_stereo_buffer[i] = ((int16_t*)buffer)[i];

#ifdef LITTLE_ENDIAN
    mp3_stereo_buffer[i]=(mp3_stereo_buffer[i]>>8 &0x00ff) | (mp3_stereo_buffer[i]<<8 & 0xff00);              
#endif

    printf("%x\n",mp3_stereo_buffer[i]&0xffff);
 }
return 0;
}