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;i mp3立体声缓冲区[i]=((uint16\u t)缓冲区[i]首先,您可以将Nuint8\u t
打包到N/2uint16\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;
}