【问题标题】:Why does `(33).to_bytes(2, 'big')` return `b'\x00!'` instead of `b'\x00\x21'`?为什么 `(33).to_bytes(2, 'big')` 返回 `b'\x00!'` 而不是 `b'\x00\x21'`?
【发布时间】:2017-01-30 01:21:36
【问题描述】:

我在 Python 中将 int 转换为字节时遇到问题。

这行得通 -

>>> (1024).to_bytes(2, 'big')
b'\x04\x00'  

然而这并不像我期望的那样工作 -

>>> (33).to_bytes(2, 'big')
b'\x00!'

我不明白什么?

【问题讨论】:

  • 注意第二个例子中的感叹号。查找它的 ASCII 值。
  • 你可以用"".join("\\x{:02}".format(b) for b in (33).to_bytes(2, "big"))强制它以十六进制显示所有字节。

标签: python python-3.2


【解决方案1】:

十进制值33按照ASCII标准映射成字符!,所以解释器可以不使用转义码来显示:

>>> b'\x21' * 3
b'!!!'

当打印字节对象时,python 将其视为一个字符序列(每个字符都保存为一个字节,每个字节通常使用一个 8 位的内存,映射成 2 个十六进制数字值,例如0x21 => 0b 0010 0001 => 33),因此具有相应可打印 ASCII 字符的值显示为它们的 ASCII 字符,其余的则由它们的十六进制值表示(格式为\xDD)。

【讨论】:

    【解决方案2】:

    根据文档 -> https://docs.python.org/3.3/library/stdtypes.html

     >>> (1024).to_bytes(2, byteorder='big')
     b'\x04\x00'
     >>> (1024).to_bytes(10, byteorder='big')
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
     >>> (-1024).to_bytes(10, byteorder='big', signed=True)
     b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
     >>> x = 1000   
     >>> x.to_bytes((x.bit_length() // 8) + 1, byteorder='little')
     b'\xe8\x03'
    

    【讨论】:

      【解决方案3】:

      您没有理解 ! 是 ASCII 字符 33,相当于 \x21。这个字节串正是你要求的字节串;它只是没有按照您期望的方式显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2012-07-09
        • 2010-11-14
        相关资源
        最近更新 更多