Python 3波模块字节序..?

Posted

技术标签:

【中文标题】Python 3波模块字节序..?【英文标题】:Python 3 wave module byteorder..? 【发布时间】:2020-12-17 12:35:44 【问题描述】:

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

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

首先,看起来 pywave 只支持“RIFF”波形文件 [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

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

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

【问题讨论】:

【参考方案1】:

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

0xf0 是单个 8 位字节。在任何现代架构上,这些位都是0x11110000。没有符号位,范围是 0 到 255(8 位存储有 28 个可能的值)。

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

0xf0 0xebbig-endian (0x11110000 0x11101011),或 0xeb 0xf0little-endian (0x11101011 0x11110000)

没有符号位的可能值的范围是 0 到 65,535(216 个值)。

对于 32 位数字等,您也可以有不同的字节顺序,但我将推迟到 Wikipedia 等进行完整说明。

【讨论】:

以上是关于Python 3波模块字节序..?的主要内容,如果未能解决你的问题,请参考以下文章

python的struct模块

python通过ntohl和htonl等函数实现主机字节序和网络字节序相互转换

Go语言中的字节序

Python网络编程——主机字节序和网络字节序之间的相互转换

字节序的理解----C语言和Python语言

node工具模块