将8位无符号PCM转换为8位有符号PCM

将8位无符号PCM转换为8位有符号PCM,c,audio,pcm,C,Audio,Pcm,如何将无符号8位PCM流(0-255)转换为有符号8位PCM流(-128-127)。它是否简单到从每个无符号字节中减去128,使0变成-128,255变成127?还是更复杂? 谢谢 你为什么不试试呢? 在我看来这应该足够了,但我不知道你在用什么语言 使用有符号和无符号整数/字符时,请记住负值的内部表示形式是两者的补码。 最安全的方法是以signed int大小计算,以避免溢出。对于您在评论中发布的代码,减去128将反转之前的操作,并将得到已签名的数据。我正在看一些我没有编写的代码,它会做一些奇怪

如何将无符号8位PCM流(0-255)转换为有符号8位PCM流(-128-127)。它是否简单到从每个无符号字节中减去128,使0变成-128,255变成127?还是更复杂? 谢谢

你为什么不试试呢? 在我看来这应该足够了,但我不知道你在用什么语言

使用有符号和无符号整数/字符时,请记住负值的内部表示形式是两者的补码。
最安全的方法是以
signed int
大小计算,以避免溢出。

对于您在评论中发布的代码,减去128将反转之前的操作,并将得到已签名的数据。

我正在看一些我没有编写的代码,它会做一些奇怪的事情,只是将unsigned转换为signed。实际上它是这样做的:“有符号字符结果=((有符号字符)(x+128))*257;”(C代码)。变量“x”的类型为“unsigned char”,包含要转换的样本。我根本不懂这个代码。*257从哪里来?但它是有效的!?乘以257,然后钳制到字符大小,就像乘以1一样,所以它应该可以工作,但可以忽略257。也许最初的程序员想要扩展0-1的范围,但谁知道呢?是的,似乎忽略了*257不会改变任何事情。所以我希望移除这个可以,不要破坏任何东西。。。也许这是一些古老的编译器错误的解决方法!?正如我已经说过的,程序员可能希望首先将[0.0,1.0]间隔扩展为256,这将导致此间隔的正确结果,但在您给出的代码中,它将返回0。也许他在257算出之前一直在摆弄数值,但我们只能猜测。好的,谢谢。因此,在任何情况下,答案都是,从无符号值中减去128一样简单!也许您应该添加要用于解决此问题的编程语言的标记。