为什么我的python格式%s没有占用空间?

2024-10-02 12:30:35 发布

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

我正在使用PyCrypto,我似乎成功地解密了我的数据。然而,我收到的那根弦的行为似乎很奇怪:

...
plaintext = cipher.decrypt(encrypted)
print 'plaintext length is %u' % len(plaintext)
print 'plaintext: %s' % plaintext
print 'plaintext is "%s"' % plaintext

明文包含我期望的字符串(“POEorOPE”),但输出看起来很奇怪:

^{pr2}$

为什么第三个print语句中的字符串似乎占用了零空间,因此它的第一个字符被我认为应该是右引号的内容覆盖?我现在以明文形式存储的内容还有什么问题吗?在

编辑:

谢谢你的评论,我知道怎么回事了。(虽然我不知道为什么我的字符串中有退格字符。)

print repr(plaintext)

'POEorOPE\x08\x08\x08\x08\x08\x08\x08\x08'

Tags: 数据字符串内容lenis字符lengthencrypted
2条回答

原来这些退格字符是由Perl的Crypt::CBC模块添加的byte padding。在这个特定的例子中,填充字节都是“08”,表示有8个字节的填充应该被删除。PyCrypto在解密或加密期间不处理填充。我可以这样去掉填充字节:

text_bytes = bytearray(plaintext,'utf-8')
num_bytes_padding = text_bytes[len(text_bytes) - 1]
text_bytes[-1 * num_bytes_padding:] = []
plaintext = text_bytes.decode('utf-8') 

一些(非常旧的)软件使用了一个巧妙的技巧来模拟粗体文本,方法是“将字符加倍”:打印字符,退格,然后再次打印字符。复制会产生一个更大、更暗的字形。在

您的字符串应该是8个字符,但是显示的长度是16个字符。这是因为添加了8个unicode代码点(属于“\x08”)(可能是作为解密过程的一部分)。在

unicode点“\x08”确实代表退格。为了说明这些只是毫无意义的unicode点:

>>> u = u'POEorOPE\x08\x08\x08\x08\x08\x08\x08\x08'
>>> print u.encode()
POEorOPE

相关问题 更多 >

    热门问题