怎样把unsigned short 转换为 unsigned char

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样把unsigned short 转换为 unsigned char相关的知识,希望对你有一定的参考价值。

char 和short 是一样的,都是1个字节,至于无符号的话,char不存在这个问题。
两者可以直接替换使用,没有问题。如果编译器有警告,则static_cast<unsigned short>(charVal),这样转化即可
参考技术A unsigned short s;
unsigned char c;
1.直接赋值
c=s;
2.强制转换
c=(unsigned char)s;
3.C++建议用法
c = static_cast<unsigned char>(s);

//short一般占两个字节
char占一个字节本回答被提问者和网友采纳
参考技术B unsigned short 转换为 unsigned char可以这样转:
unsigned short * word;
int size= WideCharToMultiByte(CP_ACP,0,word,-1, NULL, 0, NULL,0);
char * AsciiBuff =new char[size];
WideCharToMultiByte(CP_ACP,0,word,-1,AsciiBuff,size, NULL, 0);

将 unsigned char 音频转换为 short

【中文标题】将 unsigned char 音频转换为 short【英文标题】:Convert unsigned char audio to short 【发布时间】:2018-07-21 05:34:33 【问题描述】:

试图将unsigned char 转换为短。数据是音频。我的系统是Little Endian。我正在做的是这样的:

    short buf1[audio_size / 2];
    for(size_t i = 0; i < audio_size; i += 2) 
        if(i > audio_size) 
            break;
        

        if(i + 1 > audio_size) 
            buf1[i] = audio_data[i] << 8;
         else 
            buf1[i] = audio_data[i] << 8|audio_data[i + 1];
        
    

结果是音频不好,EXC_BAD_ACCESSbuf1[i] = info.data[i] &lt;&lt; 8|info.data[i + 1];

更新:

音频采样率为 8000。1 通道。 16bit PCMU mulaw。

【问题讨论】:

缓冲区的大小为audio_size / 2,但您将其索引到audio_size-1 索引,因此您可能会遇到缓冲区溢出。我怀疑你应该使用i/2 作为索引而不是i 我将上面的“可能”升级为“保证”。 @Yunnosch 是的 :) 我说的可能只是以防 audio_size 为 0 或 1 ... 为什么是垃圾标签?它是哪种语言,C 还是 C++? minimal reproducible example 在哪里?输入、输出、预期结果?阅读How to Ask,调试请求应在问题中包含所有必需的信息。哦,你不转换任何类型。 你应该使用unsigned short而不是short 【参考方案1】:

缓冲区的大小为audio_size / 2,但您将其索引到audio_size-1 索引,因此会遇到缓冲区溢出。

您应该使用i/2 而不是i 作为索引。

另外,这个循环中的另一个错误是

if(i + 1 > audio_size)

应该替换为

if(i + 1 >= audio_size)

这是缓冲区溢出的另一个原因,但这次是在另一个(源)缓冲区中

【讨论】:

感谢您解决了错误访问问题。转换呢?有什么理由让我恢复不良数据? @Seph 这是一个单独的问题,值得提出一个新问题,您可以在其中解释要转换的格式,以及您观察到的内容等... @Seph 顺便说一句,当你遇到这样的错误时,我建议你学习如何使用调试器:这将使你更有能力,而且你会更加独立(你不必在这里询问您遇到的每个错误) 感谢您发现这些错误,但不要从桥上跳到假设我的能力水平。在尝试了其他迭代后,我匆忙发布了该代码。主要问题是关于转换音频数据,而不是关闭 1 或溢出错误。感觉就像您劫持了这个问题并将其变成了其他问题。更糟糕的是,我只是一个“菜鸟”,因为我沮丧地发布了一些代码。 @Seph 我不是故意的,如果它伤害了你,我很抱歉。但是当我阅读The result is bad audio and EXC_BAD_ACCESS at buf1[i] = info.data[i] &lt;&lt; 8|info.data[i + 1]; 时,我有点明白问题的重点是缓冲区溢出问题。这是 2 个完全独立的问题,*** 问题应该一次集中处理一个问题。

以上是关于怎样把unsigned short 转换为 unsigned char的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

将 unsigned char 音频转换为 short

.NET如何把string转换成short

如何在 C 中将 short 转换为 unsigned char *buf?

将 Long 转换为 Unsigned Short Int / Strtol

C ++:从wchar_t *转换为unsigned short *是否安全?