Python 如何从随机二进制字符串中删除换行符?
我制作了一个Python脚本来生成随机二进制字符串,然后将它们转换成ASCIIPython 如何从随机二进制字符串中删除换行符?,python,binary,newline,Python,Binary,Newline,我制作了一个Python脚本来生成随机二进制字符串,然后将它们转换成ASCII from random import * def decode(binary): # credit to mhawke from stack overflow return ''.join(chr(int(binary[i*8:i*8+8],2)) for i in range(len(binary)//8)) def generate_random_binary(chars=None):
from random import *
def decode(binary):
# credit to mhawke from stack overflow
return ''.join(chr(int(binary[i*8:i*8+8],2)) for i in range(len(binary)//8))
def generate_random_binary(chars=None):
if not chars:
chars = randint(10, 20)
r = ''
for i in range(chars * 5):
num = choice(['0', '1'])
r = r + num
return r
generated = generate_random_binary(64)
decoded = decode(generated)
decoded = eval("r'''"+decoded.replace('\0', '')+"'''")
print(decoded.replace('\n', ''))
有时我会得到带有换行符的输出,即使我试图删除这些换行符。
有什么我遗漏的吗
下面是我的输出示例(在Repl.it中运行):
我认为它是LF和CR。
\n
只替换LF
请参见此处我认为最好用“.”或空格“”替换不可打印的字符 让我知道这是否适用于您: 来自随机导入的
*
导入Unicode数据
可打印={Lu',Ll'}
def将不可打印的替换为周期(str):
返回“”。如果在可打印的else中有unicodedata.category(c),则加入(c)。”
对于str中的c)
#归功于https://stackoverflow.com/a/93557/4983398
def解码(二进制):
#堆栈溢出导致mhawke贷记
返回“”。为范围(len(binary)//8)中的i连接(chr(int(binary[i*8:i*8+8],2))
def生成随机二进制文件(字符=无):
如果不是chars:
chars=randint(10,20)
r=''
对于范围内的i(字符*5):
num=choice(['0','1'])
r=r+num
返回r
生成=生成随机二进制(64)
解码=解码(生成)
decoded=eval(“r””+已解码。替换('\0','')+“'''')
打印(将不可打印的替换为周期(解码))
样本输出:
.Ä.Ô..WE..nuO.Ä...çò.Á.......Àã..c...Ñ..
category是unicode和Python的一个非常有用的特性 我认为这个问题需要澄清。通常,当您生成“随机二进制字符串”时,您不会尝试打印它。如果您想生成一个随机的可打印字符字符串,那是另一个问题。您能否澄清一下,您是要生成用于打印的“随机二进制字符串”还是“可以打印的随机字符串,不包括CR、LF、BEL和不可打印的字符。”?我只是想打印它,以确保它正常工作。我想你可以通过查看代码来了解我在做什么,这是有道理的。如果打印它是为了调试,那么最好在将字符串传递给print()之前,将所有不可打印字符和CR、CF字符映射到“.”或“”。这是用实际字符的并行打印打印十六进制转储文件时通常要做的。@Gardener:为了调试的目的,我只想
打印(repr(decoded))
;这将向您展示str
literal表单,其中包含字符串转义,而不是换行符和回车等特殊字符。在这种情况下,他们实际上应该创建一个bytes
对象(这就是存储原始随机字节的方式),默认情况下,它将打印自己的repr
。构造也会简单一些:返回字节(int(binary[i:i+8],2)表示范围内的i(0,len(binary),8))
(我冒昧地完全消除了乘法的需要)。@ShadowRanger使用repr()
是一个很好的方法!比我的初学者解决方案好多了。我的mahcine上的输出:'\x05\x07Òo§\x88x\x07\x15k~oÄÕ-z\x90[ifô«v\x1cQpew]ö
[5\x9b\xad\x0fÞè'`我想,这允许您查看非打印内容的十六进制值。如果您使用映射列打印十六进制转储,这可能对格式有点困难,但是repr()更好更快。即使使用replace('\r',''),我也得到了以下结果:hVñhxk
(四行)@Bradley:Print字符串的repr
,以及字符串本身。您将能够看到与明显的换行符对应的字符串转义。有些终端可能会将其他ASCII字符解释为换行符(例如,换行符、垂直制表符).我强烈怀疑这是真的,你真的应该在你想要接受的所有字符序列上使用random.choices
,而不是生成随机字节并丢弃你不想要的字节。谢谢,你们是最好的!
.Ä.Ô..WE..nuO.Ä...çò.Á.......Àã..c...Ñ..