Python 如何从随机二进制字符串中删除换行符?

Python 如何从随机二进制字符串中删除换行符?,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):

我制作了一个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):
    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...Ñ..