最高有效字节计算

3

我正在尝试实现一个较大的密码问题,但在处理最高有效字节(而不是位)时遇到了一个问题,我不太理解。

将int转换为byte,我使用以下代码:

def binary(i):
    if i == 0:
        return "0"
    s = ''
    while i:
        if i & 1 == 1:
            s = "1" + s
        else:
            s = "0" + s
        i >>= 1
    return s 

我非常确信以上内容是正确的,这适用于我的测试数字。要提取最高有效字节,我使用以下代码:

def msb(i):
    a = binary(i)
    b = a[0:7]
    c = int(b,2)
    return c

然而,这似乎只返回了我期望值的一半。我是不是错以为通过只取前8位就可以得到最高有效字节了,还是我漏掉了其他什么愚蠢的东西?


1
目标是获取顶部对齐的字节,还是设置最高的8位?这有很大的区别。 - ShadowRanger
4个回答

3

有更简单的方法来实现这个。例如,如果你想要前八位(忽略字节对齐),你可以这样做:

def msb(val):
    return val >> (val.bit_length() - 8)

对于 Python 3 中的最重要的对齐字节,您可以执行以下操作:

def msb(val):
    return val.to_bytes((val.bit_length() + 7) // 8, 'big')[0]

在Python 2中,您需要将其转换为十六进制字符串,然后再转回来以匹配“to_bytes”方法。

谢谢,这似乎是一个更好的做事方式,我觉得我需要更多地研究位运算! - Geordie Wicks

2
您的示例代码仅获取了前位而非8位:
def msb(i):
    a = binary(i)
    b = a[0:7]   # gets first SEVEN characters of string a
    c = int(b,2)
    return c

将它改为 a[0:8] 可以提取8个前导字符/比特,而不是7个。

真他妈的,好久没用Python了,我都忘了数组索引...非常感谢你,现在完美运行了! - Geordie Wicks
好答案 :) 我认为这是他代码的实际问题...我的提供了一种不同的解决方法 - Joran Beasley
@user2851268,你应该查看一下bitstring模块,它将处理所有关于操作位串和将其转换为整数的繁琐细节。http://pythonhosted.org/bitstring/ - Dan Lenski

0
如果你想要对齐的字节,这个方法至少从Python 2.5开始应该可以工作:
def msb(val):
    return 0 if val == 0 else val >> (((val.bit_length() - 1) >> 3) << 3)

或者,如果你更喜欢更易读的版本:
def msb(val)
    if val == 0:
        return 0
    else:
        return val >> (((val.bit_length() - 1) / 8) * 8)

0
一个字节是0xFF,你可以通过以下方式获取最高有效字节(最左边的字节)
i & (0xFF<<(n_bytes(i)-1))

我总是把最高有效位和最低有效位搞混,如果你想要最右边的字节,那就更容易了。

i & 0xFF

我觉得至少是对的...我不确定它是否能保证返回字节数...

根据你的例子,我认为第二段代码是你想要的

你也可以这样做

 s = struct.pack("i",i)
 ord(s[0])  # leftmost
 ord(s[-1]) # rightmost

sys.getsizeof 返回的数字对于这个特定情况基本上是无用的。它是 Python 分配的大小(包括对象结构),与 i 的数量级只有松散的联系。 - ShadowRanger
啊,我不知道如何获取字节数量... 我猜应该是 numbits / 8。 - Joran Beasley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接