【问题标题】:Save bytes in a .txt and read out as bytes later将字节保存在 .txt 中,稍后作为字节读出
【发布时间】:2021-11-01 21:09:02
【问题描述】:

我编写了一个小 Python 脚本,它使用 rsa 加密消息。 现在我想将字节保存在 txt 中以便以后阅读。 但是当我使用 str(...) 时,我不知道如何将字符串转换回来。

例如,我将“Test”加密为 b'Y\xf8\xbc\xca\x14\x0f\x80\xd3\xc6\xce\xecE\x14\xc1\xaf\xbd\x82\xd24\xcf\x04 \xe2\x9a\x81NF\xbeXi\x85\xef\xc4\xbbl\xd3(5\x80\xe4\xde3\x8eC\xd2jR*\xb7.gq\x8c\x8b\xa12\x1a\x10+\xbf\xefHZ\ n/'
并将其保存为字符串。 当我在其上应用 bytes(...) 时,我得到 Error: TypeError: string argument without an encoding。

我该怎么做才能做到这一点?

【问题讨论】:

    标签: python


    【解决方案1】:

    您已将 Python 字符串 representation 保存为二进制字节数组(bytestring)。

    要从这种表示中获取实际字节,请将其传递给ast.literal_eval()

    >>> import ast
    >>> s = r"b'Y\xf8\xbc\xca\x14\x0f\x80\xd3\xc6\xce\xecE\x14\xc1\xaf\xbd\x82\xd24\xcf\x04\xe2\x9a\x81NF\xbeXi\x85\xef\xc4\xbbl\xd3(5\x80\xe4\xde3\x8eC\xd2jR*\xb7.gq\x8c\x8b\xa12\x1a\x10+\xbf\xefHZ\n/'"
    >>> b = ast.literal_eval(s)
    b'Y\xf8\xbc\xca\x14\x0f\x80\xd3\xc6\xce\xecE\x14\xc1\xaf\xbd\x82\xd24\xcf\x04\xe2\x9a\x81NF\xbeXi\x85\xef\xc4\xbbl\xd3(5\x80\xe4\xde3\x8eC\xd2jR*\xb7.gq\x8c\x8b\xa12\x1a\x10+\xbf\xefHZ\n/'
    

    更好的是,只需将二进制字节保存到您的文件中,而无需通过字符串:

    encrypted_bytes = my_rsa("Test")
    with open("encrypted.bin", "wb") as f:
        f.write(encrypted_bytes)
    
    # ...
    
    with open("encrypted.bin", "rb") as f:
        encrypted_bytes = f.read()
    

    如果您真的想要这些字节的“文本安全”格式,请使用base64.b64encode()base64.b64decode()

    【讨论】:

    • 所以,我用 wb 和 rb 尝试了最后一个。但是当我使用 open(f"Accounts\{self.user}.txt", "rb") as file: lines = file.readlines() 读取文件中的字节时,我写了 b'\x936\xde9\xdf \x18\xd1t\xf7\r\xac\xb9\xf4\xfc\x8f\x0cn3\xb5C)\xe7u}\x15w\xca\xb8\x06\xdc\xd0\xd6\t\xc9\x0e\x9ce\x19 \xcb4\x17\xa9[9[\xe9\x14R~\xb9\xb3\x05\x03~"~8\x1dB\xd8\xdbw:\xdd' 但我得到了 b'\x90f\xce\xd5\xd9\ x84\x11\xeb\xc6r#f\xcc\xf4"\xd1g\xd2\x81u\xe0b(5iz\xcb\x0e\xe2\xbf\xc4\xc5q\xdc\x94\x98\xe4\xcb\x88g\xef \xa9\x8d?!\xd8\x86q\xe0\xa4\xe1\xbb\xdb\x1cd|$\x02+\xf2S\x9b\xb0\xc1\r\n'
    • 你不应该在二进制文件上使用readlines()。使用.read() 阅读所有内容。
    • 哦,好吧,但是当我在文件中写入多个 encrypted_bytes 并想分别解密它们时该怎么办?
    • 那么你需要为加密消息想出一个封装或定界方案,例如用一些不可能(或非常非常不可能)出现在真实消息中的东西来跟踪每个人,例如======================。然后,您可以按该预告片拆分读取的字节,并获得单独的消息。
    • (另一种更适用于大文件的方案是在每条消息前面加上它的长度(作为struct.pack()ed 整数),读取消息的那么多字节,然后冲洗并重复直到没有什么可读的。这基本上是一个没有类型字段的en.wikipedia.org/wiki/Type%E2%80%93length%E2%80%93value 方案。)
    猜你喜欢
    • 2012-03-21
    • 2013-01-29
    • 1970-01-01
    • 2018-01-25
    • 2013-10-18
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多