【问题标题】:Hex string manipulation in PythonPython中的十六进制字符串操作
【发布时间】:2014-03-14 03:53:03
【问题描述】:

所以我有一串十六进制值,通常是这样的:

'\x00\xff\xc0'

我需要获取每一位(不是字节,位),并将其打印在表格的单独一行中。例如:如果我有 '\xc0' 我需要取二进制值 11000000 并在一行中打印每个单独的 1 或 0。当函数返回一个 8 位二进制字符串时,这可以正常工作,例如 \xc0 返回 11000000。但是,如果我需要将 \x00 转换为 8 个零,则它不起作用。 为了更好地澄清,我需要取一个像\x01 这样的值并像这样打印它:

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 1

我尝试过使用

bin(ord(value))

但没有成功,因为某些值返回的二进制字符串少于 8 位。有谁知道怎么做?

【问题讨论】:

  • “没有成功”是什么意思?请明确说明您遇到了什么问题。

标签: python string binary hex


【解决方案1】:

在 python 3.x 中

>>> a='\x00\xff\xc0'
>>> ' '.join([bin(ord(x))[2:].zfill(8) for x in a])
'00000000 11111111 11000000'

【讨论】:

    【解决方案2】:

    有点不清楚您尝试了什么以及实际问题出在哪里。这应该可以让您继续前进,bintest.py,请确保您逐步了解该脚本中发生的事情。有什么不清楚的可以在 cmets 中询问。

    import sys
    
    
    def bits(byte):
        """Convert byte (byte string of length 1) to bits (int of value,
        0 or 1), most significant bit first.
        """
        byte_as_int = ord(byte)
        for i in reversed(xrange(8)):
            yield (byte_as_int >> i) & 1
    
    
    # Read byte string from first argument.
    bytes = sys.argv[1]
    
    
    # For each byte in the byte string, print all bit numbers and
    # the corresponding bit value, in the format as asked.
    for b in bytes:
        for i, bit in enumerate(bits(b)):
            print i, bit
    

    试试看:

    $ python bintest.py $'\x01'
    0 0
    1 0
    2 0
    3 0
    4 0
    5 0
    6 0
    7 1
    

    注意:$'...' 是 bash 允许的简洁语法,它可以正确解析 \xXX 表示法。 Python 脚本仅适用于 Python 2(这里最相关的一点是 Python 2 不会尝试解码 argv,argv 可以以原始二进制形式访问)。另请注意,您不能在命令行参数中使用 \x00,因为它会终止参数字符串(它会终止 C 字符数组)。但是,您可以在 Python 脚本中安全地使用 \x00

    【讨论】:

      【解决方案3】:

      试试这个:

      def byte2bin(byte_hex):
          return bin(int(byte_hex, 16))[2:].zfill(8)
      

      然后你可以这样做:

      hex = '\x00\xff\xc0'
      str.join(' ', (byte2bin(h.encode('hex')) for h in hex))
      

      给予:

      '00000000 11111111 11000000'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        相关资源
        最近更新 更多