【问题标题】:Using python to dump hexadecimals into YAML使用 python 将十六进制转储到 YAML
【发布时间】:2013-09-11 02:06:09
【问题描述】:

现在我正在转储到 YAML 文档中。它在大多数情况下都在正常工作。当我尝试转储诸如“0x2A”之类的十六进制时,它会转换为 42。有没有办法保持它的十六进制格式?可悲的是,字符串不会起作用。而 int(0x2A, 16) 也只是给了我一个 42。

【问题讨论】:

    标签: python hex yaml dump


    【解决方案1】:

    应该这样做:

    >>> import yaml
    >>> class HexInt(int): pass
    ... 
    >>> def representer(dumper, data):
    ...     return yaml.ScalarNode('tag:yaml.org,2002:int', hex(data))
    ... 
    >>> yaml.add_representer(HexInt, representer)
    >>> yaml.dump({"n": HexInt(42)})
    '{n: 0x2a}\n'
    

    【讨论】:

      【解决方案2】:

      用十六进制格式表示所有int,没有HexInt类,可以使用:

      def hexint_presenter(dumper, data):
          return dumper.represent_int(hex(data))
      yaml.add_representer(int, hexint_presenter)
      

      参考this answer。

      【讨论】:

      • 如果使用safe_dump 而不是dump,则此解决方案不起作用
      【解决方案3】:

      您可能正在寻找hex(0x2a) == hex(42) == '0x2a'。

      除非您正在寻找一种方法来说服您现有的转储函数使用十六进制而不是十进制表示法...


      回答您下面的评论,如果问题是您想要十六进制数字的大写字母(但0x 的小写字母),那么您必须使用字符串格式。您可以选择以下选项之一:

      "0x%02X" % 42                     # the old way
      "0x{:02X}".format(42) == "0x2A"   # the new way
      

      在这两种情况下,您都必须显式打印0x,后跟至少两位大写的十六进制数字,如果您的数字只有一位,则左填充零。这由02X 的格式表示,与C 的printf 相同。

      【讨论】:

      • 遗憾的是这不起作用:(。我需要整数格式而不是str。但是当我转换为整数时,它变成了小数>:C。(例如:int(0x0)-> 0)
      • 整数是整数。它们不是十进制或十六进制;它们是位序列。关键在于您打印它们的方式。
      • 不,我需要 0x2A 表示法。我怎么得到它?
      猜你喜欢
      • 2023-03-14
      • 2016-10-19
      • 2010-12-15
      • 2011-08-13
      • 2018-07-26
      • 1970-01-01
      • 2013-09-27
      • 2018-07-24
      • 2012-04-08
      相关资源
      最近更新 更多