我正试图从字节数组中删除某些字符(具体来说,是某些扰乱我格式的控制字符)
我手动列出了单独的翻译,效果很好,但是我可以将其格式化为单个翻译吗? 在字符串变量中,输入可以是字典表。但当我尝试此操作时,我得到一个错误,即参数必须是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”必须是类似字节的对象,因此元组、列表或字典无法工作
注意:对正则表达式解决方案或其他库不感兴趣。专门寻找这个应用程序
如果您想要一个
bytes
转换表,您将得到一个256字节的字节映射,该映射由源字节值索引到,并返回映射中的第n个字节值。您不必设置4个不同的翻译表来翻译4个字节,您可以这样做:这将允许您将不需要的字节值更改为
\x00
,如下所示:它与更改了4字节值的
test_bytes
不完全相同,因为bytestring中可打印字符的默认表示形式是可打印字符,而不是十六进制转义。如果您请求返回test_bytes
,您可以看到这一点:这里
tsbav
和bhrt
等序列显示为可打印字符,而不是十六进制转义符。但不同的只是代表性如果您正在使用
bytes
,则不能将词典用作翻译表。在Python3中,字符串是Unicode,256字节的映射表不起作用,因为该表可能需要翻译1114112个可能的代码点。因此,对于字符串,translate()
使用dict
。虽然效率很高,但是dict
无法匹配256字节字符映射以提高效率。因此bytes.maketrans()
生成256字节字符映射,而str.maketrans()
生成dict
,相应的translate()
方法需要相应类型的转换表相关问题 更多 >
编程相关推荐