【问题标题】:Representing a number using two bytes用两个字节表示一个数字
【发布时间】:2015-04-02 10:16:51
【问题描述】:

在 Python 中使用两个字节表示从 065535 的数字的最简单方法是什么?

例如,十进制的300 是二进制的0000000100101100 和十六进制的012C

当我得到300 时,我想得到的输出是两个字节:

  • 第一个是00101100(二进制表示)
  • 秒是00000001(二进制表示)

最简单的方法是什么?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    不过,我确信还有比这更好的东西:

    from struct import pack, unpack
    unpack('BB', pack('H',300))
    # gives (44, 1), the two bytes you were asking for
    

    请参阅python docs 了解可用的字母代码是什么,同时注意字节顺序。

    【讨论】:

      【解决方案2】:

      您可以使用& 255 获取低位(即与0b11111111 进行按位与):

      >>> "{:08b}".format(300 & 255)
      '00101100'
      

      和高位通过添加按位移位:

      >>> "{:08b}".format((300 >> 8) & 255)
      '00000001'
      

      有关按位运算符的更多信息,请参阅例如the Python wiki.

      【讨论】:

        【解决方案3】:

        我想你在找struct.pack:

        >>> import struct
        >>> i = 300
        >>> struct.pack("H",i)
        ',\x01'
        

        , 是它的 ascii 值 - 44。

        【讨论】:

          【解决方案4】:

          this SO answer 中所述,您可以执行以下操作:

          >>> my_hexdata = hex(300)                                     
          >>> scale = 16 ## equals to hexadecimal                       
          >>> num_of_bits = 16                                          
          >>> mybin = bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)
          >>> mybin                                                     
          '0000000100101100'                                            
          >>> mybin[:8]                                                 
          '00000001'                                                    
          >>> mybin[8:16]                                               
          '00101100'                                                    
          

          【讨论】:

          • 这只是mybin = bin(300)[2:].zfill(16)!鉴于您已经有一个整数,为什么还要麻烦转换为十六进制并返回呢?
          • 你是对的。我认为这就是问题所在。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-27
          • 1970-01-01
          • 2017-07-10
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          相关资源
          最近更新 更多