将bytearray.translate()与表一起使用

2024-09-28 23:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从字节数组中删除某些字符(具体来说,是某些扰乱我格式的控制字符)

我手动列出了单独的翻译,效果很好,但是我可以将其格式化为单个翻译吗? 在字符串变量中,输入可以是字典表。但当我尝试此操作时,我得到一个错误,即参数必须是bytearray对象

translation_table_0A = bytes.maketrans(b"\x0A", b"\x00")
translation_table_0B = bytes.maketrans(b"\x0B", b"\x00")
translation_table_0C = bytes.maketrans(b"\x0C", b"\x00")
translation_table_0D = bytes.maketrans(b"\x0D", b"\x00")
translation_table_04 = bytes.maketrans(b"\x04", b"\x00")

test_bytes = bytearray(b"\x75\x66\x73\x62\x0D\x73\x62\x0B\x00\x74\xF1\x74\x73\x62\x61\x76\x00\x0C\x76\x02\x04\x01\x62\x68\x72\x74\x00\x00\x00\x0A\x01\x00")

out_list = test_bytes.translate(translation_table_0A)  # remove \x0A
out_list = out_list.translate(translation_table_0B)  # remove \x0B
out_list = out_list.translate(translation_table_0C)  # remove \x0C
out_list = out_list.translate(translation_table_0D)  # remove \x0D
out_list = out_list.translate(translation_table_04)  # remove \x04

print(f"Output coded: {obj}")
print(f"Output decoded: {obj.decode('mac-roman')}")

我认为它的工作原理如下:

translate_dict = {b"\x0A" : b"\x00", b"\x0B" : b"\x00", b"\x0C" : b"\x00", b"\x0D" : b"\x00", b"\x04" : b"\x00", }

out_list = test_bytes.translate(translate_dict)  # remove Control Chars

但事实并非如此。有人知道如何让它工作吗

不幸的是,文档缺少细节:
bytes
bytes maketrans()
bytes methods
bytes translate()

通过maketrans方法,可以生成一个表,但“From”和“to”必须是类似字节的对象,因此元组、列表或字典无法工作

注意:对正则表达式解决方案或其他库不感兴趣。专门寻找这个应用程序


Tags: bytestableouttranslationremovetranslatelistx00
1条回答
网友
1楼 · 发布于 2024-09-28 23:25:48

如果您想要一个bytes转换表,您将得到一个256字节的字节映射,该映射由源字节值索引到,并返回映射中的第n个字节值。您不必设置4个不同的翻译表来翻译4个字节,您可以这样做:

>>> translation_table = bytes.maketrans(b"\x0A\x0B\x0C\x0D\x04", b"\x00\x00\x00\x00\x00")

这将允许您将不需要的字节值更改为\x00,如下所示:

>>> test_bytes=bytearray(b"\x75\x66\x73\x62\x0D\x73\x62\x0B\x00\x74\xF1\x74\x73\x62\x61\x76\x00\x0C\x76\x02\x04\x01\x62\x68\x72\x74\x00\x00\x00\x0A\x01\x00")
>>> test_bytes.translate(translation_table)    
bytearray (b'ufsb\x00sb\x00\x00t\xf1tsbav\x00\x00v\x02\x00\x01bhrt\x00\x00\x00\x00\x01\x00')

它与更改了4字节值的test_bytes不完全相同,因为bytestring中可打印字符的默认表示形式是可打印字符,而不是十六进制转义。如果您请求返回test_bytes,您可以看到这一点:

>>> test_bytes
bytearray (b'ufsb\rsb\x0b\x00t\xf1tsbav\x00\x0cv\x02\x04\x01bhrt\x00\x00\x00\n\x01\x00')

这里tsbavbhrt等序列显示为可打印字符,而不是十六进制转义符。但不同的只是代表性

如果您正在使用bytes,则不能将词典用作翻译表。在Python3中,字符串是Unicode,256字节的映射表不起作用,因为该表可能需要翻译1114112个可能的代码点。因此,对于字符串,translate()使用dict。虽然效率很高,但是dict无法匹配256字节字符映射以提高效率。因此bytes.maketrans()生成256字节字符映射,而str.maketrans()生成dict,相应的translate()方法需要相应类型的转换表

相关问题 更多 >