【问题标题】:chr(n) failed when n exceeds 256当 n 超过 256 时,chr(n) 失败
【发布时间】:2011-08-27 14:49:47
【问题描述】:

我正在使用chrint 将二进制表示字符串转换为真正的二进制值。

我做的是

   n=int('0101011',2)
   binary=chr(n)

那么binary就是表示字符串的真正二进制值。

但是如果我给 int 的字符串大于十进制的 256 呢?

有什么办法吗?

PS: 我使用 chr 的原因是我想将 n 转换为字符串,以便我可以使用 f.write() 将其写入文件。

这个问题来自this question

【问题讨论】:

    标签: python max chr


    【解决方案1】:

    chr() 定义为对 ASCII 字符进行操作,其值必须小于 256。如果您需要 Unicode 字符,则可以改用 unichr()

    【讨论】:

    • 如果值大于256,则返回mod 256。
    【解决方案2】:

    您可以在struct模块中给pack()方法的格式字符串中使用不同的格式字符,以轻松获取长度为1到8个字节的有符号或无符号整数的相应二进制表示字符串。

    >>> from struct import pack
    >>> pack('B', 255)
    '\xff'
    >>> pack('H', 257)
    '\x01\x01'
    >>> pack('Q', 9223372036854775807)
    '\xff\xff\xff\xff\xff\xff\xff\x7f'
    

    如果需要,可以使用f.write() 将返回的值写入文件。在向文件读取或写入二进制数据时,应在 open() 文件时将“b”附加到 mode 参数值。

    【讨论】:

      【解决方案3】:

      如果我理解您的问题,您想将二进制字符串转换为整数值。这就是您在第一行代码中所做的事情。第二行只是将一个整数值转换为 ASCII 表中该值表示的字符。因此,例如,如果字符串是 01100001,则在第一步中将转换为 int 值 97。然后第二步将 97 转换为 ASCII 字符“a”。如果您随后尝试将此变量用作数字,它将被转换回 ing 值 97。所以,如果我理解您的问题,您实际上在第 1 步之后就有了您想要的数字。

      【讨论】:

      • 我认为这不是他的目标。他想把01000001转换成65,然后再转换成a,写入文件。
      • @Anulith,是的,dlev 是对的。最终目标是将其写入文件。所以我的路线图是 1,将字符串转换为 int,2,将 int 转换为字符串,以便将其写入文件,3,写入文件
      【解决方案4】:

      在尝试转换 unicode 值时,您可能会遇到许多问题。所以使用unichr 也不总是可行的,例如:

      >>> n = int('0001f600', 16)
      >>> unichr(n)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ValueError: unichr() arg not in range(0x10000) (narrow Python build)
      

      注意错误中的 narrow Python build 消息,这意味着 Python 是在不支持宽 unicode 字符的情况下构建的,但即使是窄 Python 也可以绕过这个限制(无需使用 --enable-unicode=ucs4 标志重新编译):

      >>> n = int('0001f600', 16)
      >>> s = '\\U{:0>8X}'.format(n)
      >>> s
      '\\U0001F600'
      >>> binary = s.decode('unicode-escape')
      >>> print(binary)
      ?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-26
        • 2013-03-13
        • 2023-03-15
        • 2018-11-29
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        相关资源
        最近更新 更多