Python 3波模块字节顺序



[编辑:总之,这个问题是我对endian的含义做出(显然不正确(假设的结果(我假设它是00000001对10000000,即反转位,而不是字节(。非常感谢@triplee澄清了我的困惑。]

据我所知,Python 3 wave模块[1](我现在称之为pywave(返回的帧的字节顺序没有记录在案。我看过源代码[2][3],但还没有完全弄清楚。

首先,pywave似乎只支持"RIFF"波形文件[2]RIFF的文件使用小端序;无符号表示8位或更低的比特率,否则为有符号(2的补码(。

然而,pywave似乎将从文件中读取的字节转换为sys.byteorder[2]:

data = self._data_chunk.read(nframes * self._framesize)
if self._sampwidth != 1 and sys.byteorder == 'big':
data = audioop.byteswap(data, self._sampwidth)

除了对应于8位文件的sampwidth==1的情况。所以8位文件没有转换为sys.byteorder?为什么会这样?(也许是因为它们没有签名?(

目前我的逻辑看起来像:

if sampwidth == 1:
signed = False
byteorder = 'little'
else:
signed = True
byteorder = sys.byteorder

这是正确的吗?

8位wav文件现在非常罕见,所以这不是一个真正的问题。但我仍然想找到答案。。。

[1]https://docs.python.org/3/library/wave.html

[2]https://github.com/python/cpython/blob/3.9/Lib/wave.py

[3]https://github.com/python/cpython/blob/3.9/Lib/chunk.py

字节就是一个字节,小端或大端只对超过一个字节的数据有意义。

  • 0xf0是单个8位字节。比特是任何现代体系结构上的0x11110000。在没有符号位的情况下,范围为0到255(存储的8位可能值为28(。

  • 0xf0eb是一个16位的数字,它采用两个8位字节来表示。这可以表示为

    • 0xf0 0xebbig-endian(0x11110000 0x11101011(,或
    • 0xeb 0xf0小端序(0x11101011 0x11110000(

    没有符号位的可能值的范围是0到65535(216值(。

对于32位数字等,您也可以有不同的字节顺序,但我将参考维基百科等进行完整的阐述。

最新更新