试图了解有关内存位置和大小以MiB(兆字节)和KiB(兆字节)为单位的十六进制0x
表示法。具体来说,在分区布局表中,我可以看到以下列:
size hex '0x' notation
1 MiB 0x0010 0000
12 MiB 0x00c0 0000
128 KiB 0x0002 0000
但是我发现很难为自己转换/提取逻辑以进行计算和转换(例如,从24 MiB,125 KiB,16 MiB转换为“ 0x”十六进制表示法等)。
因此,我想到要编写一个 Python
脚本(如您所愿)来完成从MiB / KiB到'Ox'的转换以及'0x'的添加。我找到了这个[https://stackoverflow.com/a/8186974/6167676],但是我没有做任何有意义的事情。
令我惊讶的是,我找不到在线帮助我完成从MiB / KiB到十六进制“ 0x”表示法的转换的东西。在Python
中,我发现了hex
函数,试图在十六进制'0x'表示法的十六进制值之间进行基本加法:
def hex_add(h1, h2):
return hex(int(h1, 0) + int(h2, 0))
如何使用Python
(内置或不内置函数)自动计算从MiB到十六进制“ 0x”表示法的转换?此外,hex_add
是否足以对'0x'表示法进行加法运算?
一些示例代码在Python
中进行转换和添加将非常有用。
答案 0 :(得分:3)
首先,让我们为KiB,MiB,GiB等创建一些常量。在这里不必担心十六进制,我们只希望数字对您最有意义-无论是1024
还是{{ 1}}或0x400
无关紧要,因为它们都是相同的数字。所以:
2**10
现在12MiB多少钱?简单:
KiB = 1024
MiB = 1024 * KiB
GiB = 1024 * MiB
TiB = 1024 * GiB
现在,十六进制的12MiB是多少?
12 * MiB
这给您hex(12 * MiB)
。
就“添加十六进制”而言,这不是您应该做的事情。只需将数字添加为数字,然后将结果格式化为十六进制。例如,如果要添加32KiB + 16KiB + 1MiB:
'0xc00000'
您想对输出进行更多控制。如果那很重要,则需要使用format strings(无论通过hex(32*KiB + 16*KiB + 1*MiB)
函数,format
方法还是f字符串常量),而不是str.format
。>
您可以指定要填充的宽度和填充字符。您可以使用hex
自动添加#
(在这种情况下,我们必须填充8 + 2 = 10个字符而不是8个字符),或手动添加0x
(在其中情况下,我们只需要填充8个字符,这更有意义):
0x
您还希望将数字分成4个块。我们可以使用分组字符来使数字非常接近,但随后我们必须在宽度上添加额外的1:
format(12 * MiB, '#010x')
f"{12*MiB:#010x}"
f"0x{12*MiB:08x}"
…此时我们最好再次使用f"0x{12*MiB:09_x}"
:
#
现在您有了f"{12*MiB:#011_x}"
。如果您确实需要组之间的空格而不是下划线,那么您将需要变得有点难看:
'0x00c0_0000'
(我相信有人提议允许任意分组字符,但被拒绝了,因此,唯一的选择是f"{12*MiB:#11_x}".replace('_', ' ')
,_
或,
,以便“在我的语言环境中进行任何操作说”。)
因此,如果您要打印出表格:
n
或者您可以编写一个函数。在此过程中,让我们使用print( "size hex '0x' notation")
print(f"1 MiB {12*MiB:#011_x}")
print(f"12 KiB {12*KiB:#011_x}")
print(f"128 KiB {128*KiB:#011_x}")
而不是一堆单独的常量:
Enum
如果要向表中添加更多行,这显然可以扩展得多。