Python 3 wave 模块字节顺序..?
Python 3 wave module byteorder..?
[编辑:总之,这个问题是我对字节序的含义做出(显然不正确)假设的结果(我假设它是 00000001 与 10000000,即反转位,而不是字节)。非常感谢@tripleee 消除了我的困惑。]
据我所知,Python 3 wave 模块 [1](我现在将其称为 pywave)返回的帧的字节顺序没有记录。我看过源代码 [2] [3],但还没有完全弄明白。
首先,pywave 似乎只支持 'RIFF' wave 文件 [2]。 'RIFF' 文件使用小端; 8 位或更低比特率无符号,否则有符号(二进制补码)。
但是,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)
除了 sampwidth==1
的情况,它对应于一个 8 位文件。所以 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
一个字节就是一个字节,小端或大端仅对超过一个字节的数据有意义。
0xf0
是一个 8 位字节。这些位在任何现代架构上都是 0x11110000
。没有符号位,范围是 0 到 255(8 位存储得到 28 个可能的值)。
0xf0eb
是一个16位数字,需要两个8位字节来表示。这可以表示为
0xf0 0xeb
大端 (0x11110000 0x11101011
),或
0xeb 0xf0
小端 (0x11101011 0x11110000
)
没有符号位的可能值范围是 0 到 65,535(216 个值)。
您还可以对 32 位数字等使用不同的字节顺序,但我将推迟到 Wikipedia 等进行完整说明。
[编辑:总之,这个问题是我对字节序的含义做出(显然不正确)假设的结果(我假设它是 00000001 与 10000000,即反转位,而不是字节)。非常感谢@tripleee 消除了我的困惑。]
据我所知,Python 3 wave 模块 [1](我现在将其称为 pywave)返回的帧的字节顺序没有记录。我看过源代码 [2] [3],但还没有完全弄明白。
首先,pywave 似乎只支持 'RIFF' wave 文件 [2]。 'RIFF' 文件使用小端; 8 位或更低比特率无符号,否则有符号(二进制补码)。
但是,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)
除了 sampwidth==1
的情况,它对应于一个 8 位文件。所以 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
一个字节就是一个字节,小端或大端仅对超过一个字节的数据有意义。
0xf0
是一个 8 位字节。这些位在任何现代架构上都是0x11110000
。没有符号位,范围是 0 到 255(8 位存储得到 28 个可能的值)。0xf0eb
是一个16位数字,需要两个8位字节来表示。这可以表示为0xf0 0xeb
大端 (0x11110000 0x11101011
),或0xeb 0xf0
小端 (0x11101011 0x11110000
)
没有符号位的可能值范围是 0 到 65,535(216 个值)。
您还可以对 32 位数字等使用不同的字节顺序,但我将推迟到 Wikipedia 等进行完整说明。