【问题标题】:Hex Coded Decimal in PythonPython中的十六进制编码十进制
【发布时间】:2016-04-17 16:47:44
【问题描述】:

我需要创建一个函数,它接受一个整数并返回该整数的二进制字符串,编码为十六进制编码的十进制,以便稍后打包到一个结构中。

例如,我写过这样的:

def convert_int(x):
    """
    Accepts an integer, outputs a hexadecimal string in HCD format
    Caution! Byte order is ALREADY little endian!
    """
    result = b''
    while x > 0:
        hcd = chr(int(str(divmod(x, 100)[1]), 16))
        result = result + hcd
        x = divmod(x, 100)[0]
    return result

所以convert_int(1234) 将是3412h 等等。写这个最 Pythonic 和优雅的方式是什么?

upd:使函数输出小端字符串准备打包。

【问题讨论】:

  • stackoverflow 的总体思路是编写一些代码,如果它不起作用,你首先使用知名搜索引擎努力搜索可以复制的可能解决方案或适应您的需求,然后只有当您的代码无法正常工作时,您才能创建一个 stackoverflow 问题并粘贴一些最小且可执行的代码,并显示您遇到的问题。请注意该序列的第一部分:编写一些代码。
  • 对不起,我搞砸了字符串格式。当然应该是0x1234 而不是\x12\x34
  • 不错的一个。让我们把这件事做好。所以你想要例如convert_to_hcd(1234) 返回字符串0x1234?你确定吗?
  • 是的,这正是我所需要的。我试图通过将整数作为字符串处理来解决它,但我认为这是一个坏主意,而且无论如何都不是 Pythonic。
  • 好的。您是否尝试过编写任何 Python 代码?

标签: python hex


【解决方案1】:
def convert_to_hcd(num):
    chars = []
    while num:
        num, ones = divmod(num, 10)
        num, tens = divmod(num, 10)
        chars.append(chr(tens * 16 + ones))
    chars.reverse()
    return "".join(chars)

convert_to_hcd(1234)    # => returns '\x124' (which is correct because '\x34' == '4')

【讨论】:

    【解决方案2】:

    所以,对我来说正确的代码如下,注意字节顺序是颠倒的(小端序)

    def convert_int(x):
    """
    Accepts an integer, outputs a hexadecimal string in HCD format
    Caution! Byte order is ALREADY little endian!
    """
    result = b''
    while x > 0:
        hcd = chr(int(str(divmod(x, 100)[1]), 16))
        result = result + hcd
        x = divmod(x, 100)[0]
    return result
    

    【讨论】:

      【解决方案3】:

      这个小sn-p怎么样... :)

      def convert_to_hcd(num): return "".join([ "\\x"+ (lambda i, k: ""+i+k if i !='m' else "0"+k)(i,k) for i,k in zip((numif not len(num) % 2 else 'm' +num) [0::2], (numif not len(num) % 2 else 'm' +num[1::2])])

      【讨论】:

      • 如果 OP 试图参加一个混淆的 Python 竞赛,那将是一个很好的答案,但否则,这太难了:)
      • 你不是这么说的...... :)
      • 但它确实有效(如果 OP 没有重新表述问题)。
      【解决方案4】:
      def intToHex(num):
          numBin = [int(n) for n in str(num)]
          result = 0
          for n in numBin:
              result = result*16 + n
          return(hex(result))
      

      这很干净

      【讨论】:

      • 嗯,不是吗? hex 将一个 int 转换为一个字符串,它与 OP 试图做的事情没有任何关系
      • 其实这个函数做的更容易:return '0x' + str(num)。参考 Yuri 的回答,看看他想要什么;不是这个。当然问题不是很清楚。
      【解决方案5】:
      >>> hex(1234)
      '0x4d2'
      

      Google 不是你的敌人...

      【讨论】:

      • 不是他要问的问题,否则它会返回“0x1234”。
      猜你喜欢
      • 2023-03-19
      • 2013-06-10
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2023-03-14
      • 2023-01-29
      相关资源
      最近更新 更多