标签: python-bytearray

在 Python 中对字节对象进行切片是否会创建一个全新的数据副本?

假设我有非常大的字节对象(加载二进制文件后),我想逐部分读取并推进起始位置直到它到达末尾。我使用切片来实现这一点。我担心每次我请求切片时 python 都会创建全新的副本,而不是简单地给我指向我想要的位置的内存地址。

简单的例子:

data = Path("binary-file.dat").read_bytes()
total_length = len(data)
start_pos = 0

while start_pos < total_length:
   bytes_processed = decode_bytes(data[start_pos:])  # <---- ***
   start_pos += bytes_processed 
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,python 是否由于start_pos切片而从 开始创建全新的字节对象副本。如果是这样,避免数据复制并仅使用指针传递到字节数组的相关位置的最佳方法是什么。

python python-bytearray

12
推荐指数
1
解决办法
4858
查看次数

如何将base64字符串直接解码为二进制音频格式

音频文件通过API发送给我们,该API是Base64编码的PCM格式。我需要将其转换为PCM,然后转换为WAV进行处理。

我能够使用以下代码解码->保存到pcm->从pcm读取->另存为wav。

decoded_data = base64.b64decode(data, ' /')
with open(pcmfile, 'wb') as pcm:
    pcm.write(decoded_data)
with open(pcmfile, 'rb') as pcm:
    pcmdata = pcm.read()
with wave.open(wavfile, 'wb') as wav:
    wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
    wav.writeframes(pcmdata)
Run Code Online (Sandbox Code Playgroud)

如果我可以将输入字符串解码为二进制并将其另存为wav,会容易得多。所以我在python中将字符串转换为二进制中 做了类似的事情

  decoded_data = base64.b64decode(data, ' /')
    ba = ' '.join(format(x, 'b') for x in bytearray(decoded_data))
    with wave.open(wavfile, 'wb') as wav:
        wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
        wav.writeframes(ba)
Run Code Online (Sandbox Code Playgroud)

但是我错a bytes-like object is required, not 'str'wav.writeframes

也尝试过base54.decodebytes()并得到相同的错误。

正确的方法是什么?

python base64 decode wav python-bytearray

6
推荐指数
1
解决办法
998
查看次数

将字符串附加到bytearray

我有一个字节数组arr和一个十六进制数a:

arr = bytearray()
a = 'FE'
Run Code Online (Sandbox Code Playgroud)

如何将此数字附加到bytearray以具有相同的值,FE?我尝试过print(int(a, 16)),但似乎是一个坏主意(它打印254而不是FE).

python python-bytearray

5
推荐指数
1
解决办法
3728
查看次数

如何实现readinto()方法

我想实现一个从RawIOBase继承的类。我正在努力实现readinto方法。基本上,我不知道如何更改作为参数传递的bytearray对象的内容。

我已经尝试过以下(幼稚的)方法:

def readinto(self, b):
    data = self.read(len(b))
    b = data
    return len(data)
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这会将新bytearray对象分配给局部变量b,并且不会更改原始对象的内容bytearray

python python-bytearray

5
推荐指数
1
解决办法
1069
查看次数

是否可以有效地使用非零值初始化字节数组?

我需要一个巨大的布尔数组。所有值都应初始化为“ True”:

arr = [True] * (10 ** 9)
Run Code Online (Sandbox Code Playgroud)

但是按上述方法创建会占用太多内存。所以我决定使用bytearray它:

arr = bytearray(10 ** 9)  # initialized with zeroes
Run Code Online (Sandbox Code Playgroud)

是否有可能初始化bytearrayb'\x01'同样有效,因为它是由初始化b'\x00'

我知道我可以bytearray用零初始化并反逻辑。但是如果可能的话,我宁愿不这样做。

timeit

>>> from timeit import timeit
>>> def f1():
...   return bytearray(10**9)
... 
>>> def f2():
...   return bytearray(b'\x01'*(10**9))
... 
>>> timeit(f1, number=100)
14.117428014000325
>>> timeit(f2, number=100)
51.42543800899875
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-bytearray

4
推荐指数
1
解决办法
2340
查看次数

类型错误:“bytearray”对象不能解释为整数

我想通过 HTTP 发送音频数据,但我不明白为什么会出现此异常:

Exception happened during processing of request from ('127.0.0.1', 59976)
Traceback (most recent call last):
  File "/usr/lib/python3.6/socketserver.py", line 654, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/lib/python3.6/socketserver.py", line 364, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.6/socketserver.py", line 724, in __init__
    self.handle()
  File "/usr/lib/python3.6/http/server.py", line 418, in handle
    self.handle_one_request()
  File "/usr/lib/python3.6/http/server.py", line 406, in handle_one_request
    method()
  File "/home/vivanov/temp.py", line 113, in do_GET
    data.append(bytearray(stream.read(CHUNK)))
TypeError: 'bytearray' object cannot be interpreted as an integer
Run Code Online (Sandbox Code Playgroud)

问题似乎与将值传递给wfile.write.

我该如何解决这个问题?

这是我的代码:

Exception happened during processing …
Run Code Online (Sandbox Code Playgroud)

python http python-3.x python-bytearray

1
推荐指数
1
解决办法
8828
查看次数

标签 统计

python ×6

python-bytearray ×6

python-3.x ×2

base64 ×1

decode ×1

http ×1

wav ×1