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

2024-10-03 21:35:24 发布

您现在位置:Python中文网/ 问答频道 /正文

试图理解有关MiB(mebibytes)和KiB(kibibytes)中内存位置和大小的十六进制0x表示法。具体来说,在分区布局表中,我可以看到以下列:

size        hex '0x' notation           
1 MiB       0x0010 0000    
12 MiB      0x00c0 0000
128 KiB     0x0002 0000

但是我发现很难翻译/提取逻辑来计算和自己进行转换(例如从24mib、125kib、16mib转换为'0x'十六进制符号等)。在

因此,你要做的就是把你的思想从cdb'转换成。我发现了这个[https://stackoverflow.com/a/8186974/6167676],但我没有从中做任何有意义的事情。在

令我惊讶的是,我找不到在线的东西来帮助我把MiB/KiB转换成hex'0x'符号。在Python中,我发现了hex函数,试图在十六进制“0x”表示法中的十六进制值之间进行基本加法:

^{pr2}$

如何使用Python(内置或非函数)自动计算从MiB到十六进制'0x'表示法的转换?另外,hex_add是否足以对“0x”表示法执行加法?在

一些代码示例演示Python中的转换和加法非常有用。在


Tags: 函数内存size符号布局逻辑思想分区
1条回答
网友
1楼 · 发布于 2024-10-03 21:35:24

首先,让我们为KiB、MiB、GiB等创建一些常量。在这里不要担心hex,我们只需要任何形式的数字,不管是1024还是{}或{}都不重要,因为它们都是相同的数字。所以:

KiB = 1024
MiB = 1024 * KiB
GiB = 1024 * MiB
TiB = 1024 * GiB

12磅多少钱?简单:

^{pr2}$

12磅十六进制是多少?在

hex(12 * MiB)

这给你'0xc00000'。在


至于“添加十六进制”,这不是你应该做的事情。只需将数字作为数字相加,然后将结果格式化为十六进制。例如,如果要添加32KiB+16KiB+1MiB:

hex(32*KiB + 16*KiB + 1*MiB)

你想要更多的控制输出。如果这很重要,则需要使用format strings(无论是通过format函数、str.format方法或f-string文本)而不是hex。在

您可以指定填充到的宽度和填充字符。您可以使用#自动添加0x(在这种情况下,我们必须填充到8+2=10个字符,而不是8个字符),或者手动添加{}(在这种情况下,我们只需要填充到8个字符,这就更有意义了):

format(12 * MiB, '#010x')
f"{12*MiB:#010x}"
f"0x{12*MiB:08x}"

你还想把数字分成4块。我们可以使用一个分组字符来接近,但是我们必须在宽度上增加一个额外的1:

f"0x{12*MiB:09_x}"

……此时,我们不妨再次使用#

f"{12*MiB:#011_x}"

现在你得到了'0x00c0_0000'。如果你真的需要组之间的空格而不是下划线,那么你就需要有点难看了:

f"{12*MiB:#11_x}".replace('_', ' ')

(我相信有人提议允许任意分组字符,但是被拒绝了,所以只有_,,或者{}表示“按我的语言环境所说的做”。)


所以,如果你想打印出你的表格:

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,而不是一堆单独的常量:

import enum
class Prefixes(enum.Enum):
    Ki = 1024
    Mi = 1024 * Ki
    Gi = 1024 * Mi
    Ti = 1024 * Gi
def printrow(n, prefix):
    label = f"{n} {prefix.name}B"
    print(f"{label:<12}{n * prefix.value:#011_x}")
print("size        hex '0x' notation")
printrow(1, Prefixes.Mi)
printrow(12, Prefixes.Ki)
printrow(128, Prefixes.Ki)

如果您想向表中添加更多的行,这显然具有更高的可扩展性。在

相关问题 更多 >