如何将十进制字符串转换为十六进制字符串?

use*_*766 6 jinja2 ansible

我有一个剧本,用于查询服务器的 SystemID,可以使用供应商提供的将 id 映射到模型的表将其转换为型号。服务器返回十进制值,但表使用等效的十六进制值。

我想要做的是将十进制字符串转换为可以与供应商提供的表中的条目匹配的十六进制字符串。

例子:

Server returns: SystemID = 1792
Matching entry in vendor table: 0x0700
Run Code Online (Sandbox Code Playgroud)

我在 Ansible 文档和 Web 中搜索了本机 Ansible 命令或 jinja2 表达式来进行转换。

我只发现int(value, base=x)jinja2 函数的作用与我想要做的相反。

本机 pythonhex()命令可以做到这一点。但如果可能的话我想避免这种情况。

以下是解析服务器标准输出以获取 systemid 值的 playbook 任务:

Server returns: SystemID = 1792
Matching entry in vendor table: 0x0700
Run Code Online (Sandbox Code Playgroud)

环境:Ansible 2.9.7 Python 3.8.0 macOS 10.15.4

Zei*_*tor 6

在 python 3 下运行最新版本的 ansible 时,您可以使用该.format()函数:

$ ansible localhost -m debug -a msg="{{ '{:#x}'.format(1792) }}"
localhost | SUCCESS => {
    "msg": "0x700"
}
Run Code Online (Sandbox Code Playgroud)

同时,您仍然可以在 jinja2 模板字符串中使用带有运算符的旧版Python 格式。%这也适用于旧的 ansible 版本:

$ ansible localhost -m debug -a msg="{{ '%#x' % 1792 }}"
localhost | SUCCESS => {
    "msg": "0x700"
}
Run Code Online (Sandbox Code Playgroud)

您可能仍然需要处理文件中存在的前导 0(即0x0700)。

如果文件中的所有值都填充为 4 个十六进制数字(即在前缀之后0x),则可以使用以下内容(请注意,长度 6 的填充考虑了前缀):

$ ansible localhost -m debug -a msg="{{ '{:#06x}'.format(1792) }}"
localhost | SUCCESS => {
    "msg": "0x0700"
}
$ ansible localhost -m debug -a msg="{{ '%#06x' % 1792 }}"
localhost | SUCCESS => {
    "msg": "0x0700"
}
Run Code Online (Sandbox Code Playgroud)

如果没有,您将必须自己对下一个奇数个字符实施某种动态 0 填充。

如果供应商表中九位以上的十六进制数字为大写,您可能需要将“x”类型说明符切换为“X”(请参阅​​上面的文档链接)。

$ ansible localhost -m debug -a msg="{{ '{:#06x}'.format(2569) }}"
localhost | SUCCESS => {
    "msg": "0x0a09"
}
$ ansible localhost -m debug -a msg="{{ '%#06x' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0a09"
}

$ ansible localhost -m debug -a msg="{{ '{:#06X}'.format(2569) }}"
localhost | SUCCESS => {
    "msg": "0X0A09"
}
$ ansible localhost -m debug -a msg="{{ '%#06X' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0A09"
}
Run Code Online (Sandbox Code Playgroud)

同时,如果您想在十六进制数字中使用大写字母并保留0x前缀小写,则需要进行一些调整,更改格式以删除前缀并自行对其进行硬编码(请注意,由于前缀,填充会下降到 4)离开了):

$ ansible localhost -m debug -a msg="{{ '0x{:04X}'.format(2569) }}"
localhost | SUCCESS => {
    "msg": "0x0A09"
}
$ ansible localhost -m debug -a msg="{{ '0x%04X' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0A09"
}
Run Code Online (Sandbox Code Playgroud)

请参阅我用于最新编辑的其他很好的参考。