【问题标题】:Transform ordinary string (which is supposed to be a binary string) back into a binary string将普通字符串(应该是二进制字符串)转换回二进制字符串
【发布时间】:2021-05-09 20:00:46
【问题描述】:

所以我目前正在使用库:simple-crypt。

我已经设法将某个输入字符串转换成它的二进制字符串。

        pw_data = input("Please type in your p!")  # enter password
        pw_data_confirmed = input("Please confirm!")
        _platform = input("Please tell me the platform!")  # belonging platform
        if pw_data == pw_data_confirmed:  # check confirmed pw
            print("Received!")

            salt_data = "AbCdEfkhl"  # salt key

            ciphertext = encrypt(salt_data, pw_data.encode("utf8"))  # encrypt pw with salt key

二进制字符串 例如:b'sc\x00\x02X\xd8\x8ez\xbfB\x03s\xc5\x8bm\xecp\x19\x8d\xd6lqW\xf1\xc3\xa4y\x8f\x1aW)\x9bX\xfc\ x0e\xa4\xf2ngJj/]{\x80\x06-\x07\x8cQ\xeef\x0b\x02?\x86\x19\x98\x94eW\x08}\x1d8\xdb\xe57\xf7\x97\x81\xb6\ xc7\x08\n^\xc9\xc0'

这个二进制字符串将被存储在一个word文档中。

现在的问题是: 一旦我阅读了文档并获得了这个特定的二进制字符串,它就无法识别它 不再是二进制字符串。相反,它现在是字符串数据类型。

p_loc = input("Which platform do you need?")
doc_existing = docx.Document(r"xxx")
text = []
for i in doc_existing.paragraphs:
    text.append(i.text)

for pos,i in enumerate(text):
    if i == p_loc:
    len_pos = len(text[pos+1])
    p_code = text[pos+1][2:len_pos-1]  # get the binary string which is of type ordinary string
print(p_code.encode("utf8"))  # when I apply .encode , another \ is added so I have for my binary code two \\


salt_data = "AbCdEfkhl"

plain = decrypt(salt_data, p_code)

print(plain)

p_code 没有 .encode 语句(作为字符串,而不是字节串!): sc\x00\x02X\xd8\x8ez\xbfB\x03s\xc5\x8bm\xecp\x19\x8d\xd6lqW\xf1\xc3\xa4y\x8f\x1aW)\x9bX\xfc\x0e\xa4\xf2ngJj/]{\ x80\x06-\x07\x8cQ\xeef\x0b\x02?\x86\x19\x98\x94eW\x08}\x1d8\xdb\xe57\xf7\x97\x81\xb6\xc7\x08\n^\xc9\ xc0

当我现在打印出 p_code.encode("utf8") 时,我得到以下结果: b'sc\\x00\\x02X\\xd8\\x8ez\\xbfB\\x03s\\xc5\\x8bm\\xecp\\x19\\x8d\\xd6lqW\\xf1\\xc3\\xa4y\\ x8f\\x1aW)\\x9bX\\xfc\\x0e\\xa4\\xf2ngJj/]{\\x80\\x06-\\x07\\x8cQ\\xeef\\x0b\\x02?\\x86\ \x19\\x98\\x94eW\\x08}\\x1d8\\xdb\\xe57\\xf7\\x97\\x81\\xb6\\xc7\\x08\\n^\\xc9\\xc0'

所以问题是,如果您将第二个二进制字符串与原始二进制字符串进行比较,它会向其中添加第二个 \。因此,我无法解码此二进制字符串,因为它不会将其识别为原始二进制代码字符串。

所以我的问题是: 有没有一种随意的方法可以将已经是二进制样式的字符串简单地转换回二进制字符串,所以它是一样的? 或者有没有办法可以删除第二个 \ 以便我再次拥有原始二进制字符串?

我非常感谢任何帮助!

【问题讨论】:

  • "这个二进制字符串将被存储在一个 word 文档中。"目前尚不清楚您的意思是什么。您提供的示例“二进制字符串”(b'sc\x00\x02...)不是字符串。它是一个字节对象。术语“二进制字符串”具有误导性。您如何将这些字节存储到文档中?你用的是python 2还是3?
  • 如果我解释不清楚,我很抱歉。首先我使用python3.8。我所做的是:我使用某个输入字符串,例如“Hellothisisme”并对其进行加密。我使用 simple-crypt,在应用 simple-crypt 之前,我使用 encode(utf8) 将字符串转换为二进制字符串。然后这个二进制字符串将被附加到一个带有 docx 的 word 文档中。问题是:一旦我将它存储在单词中,它现在是字符串类型。所以当我现在尝试访问这个字符串时,它是一个二进制字符串,它被转换成一个字符串,所以它不会被识别为一个字节串。
  • 我测试了它: type(p_code) 并打印出来: str
  • 我会避免使用术语“二进制字符串”,如果你有一个字符串,并且你用 utf-8 对其进行编码,结果是字节。您如何将这些字节存储到 word 文档/文件中?
  • mydoc = docx.Document() mydoc.add_heading("存储的数据") mydoc.add_paragraph("") mydoc.add_paragraph("") mydoc.add_paragraph(f"{_platform}") mydoc .add_paragraph(f"{ciphertext}") mydoc.save(r"xxx") 这就是我存储它的方式。密文=加密(salt_data,pw_data.encode(“utf8”))。密文的输出是我在文档中发布的二进制字符串,然后作为字符串。

标签: python string binary encode python-simple-crypt


【解决方案1】:

好的。因此,当您执行 f"{ciphertext}" 时,您是在告诉 python 将这些字节的 字符串表示形式 作为文本存储在文档中。

例如

>>> b = b"\x00\x01\x65\x66"
>>> print(f"{b}")
b'\x00\x01ef'

您(可能)并不想将b'\x00\x01ef' 存储在您的word 文档中。以文本形式存储二进制数据的一个很好的通用方法是使用不同的编码。 Base64 是一种常用的编码,旨在以基于文本的形式存储二进制数据。

更多信息请参见https://docs.python.org/3/library/base64.html

在你的情况下,你做类似的事情

import base64

cipher_b64_b = base64.b64encode(ciphertext)
cipher_b64 = cipher_b64_b.decode() # cipher_b64 is now a string.
# Now store this cipher_b64 string in your word document

...

# Now you fetch p_code (which is now a base64 string) from your word doc
cipher_b64_b = p_code.encode()
cipher = base64.b64decode(cipher_b64_b)

这会产生您的原始二进制密文。 word 文档将包含一个 base64 编码的字符串,例如“AAFlZg==”,这样可以避免您的 word 文档中出现转义序列等问题。

【讨论】:

  • 现在可以完美运行了。非常感谢您的参与!这真的帮助了我,我学到了很多东西!
  • 非常好,很高兴为您提供帮助:)
最近更新 更多