将MiB / KiB转换为十六进制“ 0x”表示法并进行加法的脚本(Python)

时间:2018-07-17 05:52:36

标签: python python-3.x hex

试图了解有关内存位置和大小以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中进行转换和添加将非常有用。

1 个答案:

答案 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

如果要向表中添加更多行,这显然可以扩展得多。