【问题标题】:How to print hex number in little endian, padded zeroes, and no '0x' in python?如何在小端打印十六进制数,填充零,在python中没有'0x'?
【发布时间】:2023-03-22 17:55:02
【问题描述】:

我想编写一个循环,以 4B 十六进制数字格式打印 1 到 50000。但是,我需要十六进制数字采用小端格式,显示所有零到 4B,并且在开头不显示“0x”。

例子:

数字 50,000 是十六进制的 0xc350。

我要打印:50C30000

这是我目前所拥有的,我只是不知道如何添加零以使其成为 4B 格式:

import struct
print hex( struct.unpack( '<H', struct.pack('>H', 50000) ) [0] ) [2:].upper()
#Output is 50C3

~谢谢

【问题讨论】:

    标签: python format hex


    【解决方案1】:

    假设您已经获得了转换为 little-endian 工作的部分。您要问的部分是如何将数字格式化为特定字符串。

    这正是format 函数的用途:

    >>> h = 20675
    >>> format(h, '04X')
    50C3
    

    完整的细节在Format Specification Mini-Language,但简要:

    • 'X' 是一个 type 字段,意思是“十六进制格式。输出以 16 为底的数字,对 9 以上的数字使用大写字母。”
    • '4' 是一个 width 字段,这意味着任何短于 4 个字符的内容都将被填充。
    • '0' 是一个……特殊情况,显然没有名称,但是“在宽度字段前面加上一个零 ('0') 字符可以为数字类型启用符号感知零填充。这相当于填充字符 ' 0',对齐类型为 '='。"

    但让我们重温一下第一句话。你没有有字节交换的权利,因为你想要一个 32 位 little-endian 数字,而你正在创建一个 16 位数字。这就是'H' 的意思。如果你想要 32 位,你必须使用'I'

    然后,当然,您需要将宽度从4 更改为8

    【讨论】:

    • 鉴于我已经拥有的东西,我可以以某种方式将我拥有的东西插入到这个 format() 函数中?
    • @Ian004:嗯,我的h 正是你从struct.unpack( '&lt;H', struct.pack('&gt;H', 50000) ) [0] 得到的。你能从那里弄清楚吗?
    • 是的,但是我相信“X”类型字段正在将其转换回标准十六进制,从而使我所做的字节序格式无效。我的输出现在是 000050C3
    • 格式中的零填充始终在字符串的左侧。 @abarnert 有没有办法改变方向?我只是出于这个原因使用 ljust。
    • @Ashwin:是的,0 的填充总是在左边。我们实际上并没有将数字格式化为 little-endian,我们是在对数字进行字节交换,然后将其格式化为 big-endian。这意味着我们必须交换正确数量的字节才能获得所需的输出。
    【解决方案2】:

    ljust怎么样?

    import struct
    print hex( struct.unpack( '<H', struct.pack('>H', 50000) ) [0] ) [2:].upper().ljust(8, '0')
    #Outputs 50C30000
    

    ljust(8,'0') 将字符串向左对齐,将字符串的长度更改为 8 个字符,如果指定了任何填充字符,则用该字符填充空格。这里填充字符被添加到字符串的right

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2015-02-14
      相关资源
      最近更新 更多