【问题标题】:encrypting a string via binary manipulation通过二进制操作加密字符串
【发布时间】:2014-06-23 18:32:03
【问题描述】:

我遇到了涉及加密字符串的问题。我正在做的是使用ord() 函数将每个字母转换为数字,然后将其转换为二进制代码。然后我将其反转或异或数字,以便对于具有二进制代码“0100 0001”的字母“A”在转换回十进制值时将变为“1011 1110”将是190,我将chr() 回到一个字母。我注意到某些字母根本不会转换成任何可以看到的符号。当我尝试将157 的十进制值转换为ASCII 字符时。我得到了 '\x9d' 而不是 ASCII 值。根据扩展 ASCII 代码,它应该给了我一个符号,我可以使用打印功能读取它并将其打印到文件中。有什么方法可以让 Python 将其打印成可读的符号以便我可以打印它?现在我无法让它工作,因为程序无法将它打印成我可以读取和反转过程的符号。

【问题讨论】:

    标签: python string binary


    【解决方案1】:

    Python 默认显示字符串的表示,除非您明确打印它们。 \x9d 是字符的repr(表示),如果您打印它,您会看到其他内容,具体取决于终端使用的编码和字体

    >>> chr(157)
    '\x9d'
    >>> print repr(chr(157)) # equivalent to the above
    '\x9d'
    >>> print chr(157)
    � # this appears as a question mark in a diamond shaped box on my system
    

    但这并不会阻止您将数据写入文件。

    编辑

    如果通过“扩展ASCII”你指的是这个字符集http://en.wikipedia.org/wiki/Code_page_437,你应该可以使用

    >>> print chr(157).decode('CP437')
    ¥
    

    这将返回一个适合打印的 unicode 字符串(如果您的终端支持)。

    编辑 2

    在 Python 3.x 中有点不同,因为 ord 返回一个 unicode str。相反,您需要一个 bytes str(相当于 Python2.x str):

    >>> bytes([157]) # this is equivalent to ord(157) in Python 2.x
    b'\x9d'
    >>> bytes([157]).decode('cp437') # decode this to a unicode str with the desired encoding
    '¥'
    >>> print(bytes([157]).decode('cp437')) # now it's suitable for printing
    ¥
    

    确保在将数据写入文件时写入原始的bytes str,而不是 unicode(可打印)str:

    >>> data = bytes([154, 155, 156, 157])
    >>> print (data.decode('cp437')) # use decode for printing
    Ü¢£¥
    >>> with open('output.dat', 'wb') as f:
    ...     f.write(data) # but not for writing to a file
    ...
    4
    >>> with open('output.dat', 'rb') as f:
    ...     data = f.read()
    ...     print(data)
    ...     print(data.decode('cp437'))
    ...
    b'\x9a\x9b\x9c\x9d'
    Ü¢£¥
    

    【讨论】:

    • 我刚刚在 python IDLE Shell 中尝试过,它说“SyntaxError: invalid syntax”,然后我尝试使用 print() ( 作为 chr(157).decode('CP437'),它也不起作用。它说“AttributeError:'str' 对象没有属性'decode',我尝试不打印。同样的问题。str 没有”没有解码。我使用的是 Python IDLE 3.3.2,我知道它与 2.x python 不同。有什么建议吗?我同时使用了 dir 和 help,chr() 中没有解码也没有编码。
    • @user3444888 我已经用 Python 3.x 的代码更新了答案
    • 谢谢!有效!有没有办法扭转它?当我尝试使用 ord() 时,它给出了 165,但初始值为 157。
    • @user3444888 不用担心,如果这回答了您的问题,请将其标记为已接受的解决方案。使用ord 转换回来时,请确保您转换的是原始字节字符串数据,而不是 unicode 版本。 ord(bytes([157])) 工作正常,因此如果您的数据是 unicode 格式,您可能需要使用 ord(data.encode('cp437'))
    • 好的,如何将其标记为已接受的解决方案?我只是尝试使用编码,但它不起作用。我将 bytes([157]).decode('cp437') 放入变量 Y 中,但是当我尝试反转它时,它没有给出原始值。它给出了 165 而不是 157。 ord(data.encode('cp437')) 我应该使用 Y 代替数据吗?我试过了,但它说 str 不能被解释为 int。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2012-08-27
    • 2012-05-07
    • 2021-05-09
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多