Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将16位字节数组读入整数而不截断_Python_Wav_Esp32_Micropython - Fatal编程技术网

Python 将16位字节数组读入整数而不截断

Python 将16位字节数组读入整数而不截断,python,wav,esp32,micropython,Python,Wav,Esp32,Micropython,我有一个I2S麦克风连接到一个微控制器,并成功地将16位音频WAV音频转储到一个python bytearray对象,该对象如下所示(使用): 我已成功地将这些bytearray转储写入我创建的文件,如下所示: wav = open('16bitaudio.wav','wb') #....some code to write the wav header wav.write(raw) wav.close() 当我在电脑上打开它时,它会播放我忠实录制的样本,听起来很棒 我的问题来了-我想把这些数

我有一个I2S麦克风连接到一个微控制器,并成功地将16位音频WAV音频转储到一个python bytearray对象,该对象如下所示(使用):

我已成功地将这些bytearray转储写入我创建的文件,如下所示:

wav = open('16bitaudio.wav','wb')
#....some code to write the wav header
wav.write(raw)
wav.close()
当我在电脑上打开它时,它会播放我忠实录制的样本,听起来很棒

我的问题来了-我想把这些数据转换成一个整数,它代表我样本中声音的平均强度。我首先尝试这样做:

intensity = sum(raw)/count(raw)
然而,这往往会导致几乎所有时间都有128个数字——这对我来说意味着它被读取为随机字节。经过进一步研究,这些数组函数似乎假设我们只有一个8位字节(读取值b'\xffW',我认为这是一个小的endian 22527):

这似乎只是b'\xff'部分

我可以通过将字节解析为int.from_字节来获得期望值:

>>> int.from_bytes(b'\xffW','little')
22527
但是,如果不将bytearray截断为8位,我似乎无法遍历它

最后,我已经阅读了struct.unpack方法-看起来还可以,但我不确定bytearray是否包含长度一致的字节。。。。e、 g:

>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8

尽管我只看到了6个字节。解包的最终问题是我不确定每个字节是提前8位还是提前16位,所以我不知道在第二个参数中使用什么字母组合

因此,考虑到b字符串表示,python似乎确实知道字节的编码方式,但是我手头的普通数组函数似乎是从bytearray获取这些信息。我确信有一种python方法可以将这个bytearray解析为整数,但我就是找不到它


非常感谢@juanpa.arrivillaga为我提供的帮助。我使用的阵列库似乎解决了我所有的问题:

import array
result = array.array('h', raw)
这里输出的数值与我的音频文件的示波器相同。。。。干杯


共有8个字节,可打印ascii范围内的任何字节都会打印为相应的ascii字符,因此在第一个字节后有一个字节
o
,在最后有一个字节
d
。无论如何,字节数组是一个字节数组,因此当您对其进行迭代时,它将覆盖缓冲区的8位部分。那么,您似乎知道可以使用
struct.unpack
,问题到底是什么?“我不确定每个字节是提前8位还是提前16位”嗯?一个字节是8位,但您正在尝试解包16位表示有符号整数?也许我不知道解包是如何工作的,但它似乎需要一个格式字符串来定义序列中每个字节的长度。我不知道如何从我的
bytearray
的形状推断出这一点(不需要手动操作)-也许更好的问题是“如何将我的16位bytearray
bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d')
转换为6个无符号整数的序列”你所说的字节长度是什么意思?一个字节总是8位。格式字符串提供您尝试创建的类型的格式(包括位长度)。无论如何,使用
array
方法,它采用相同的格式字符串,您只需要
导入数组;array.array('h',raw)
例如,它创建了一个由16位有符号整数组成的数组,我想这就是您想要的(您还不是很清楚)
>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8
import array
result = array.array('h', raw)