最重要的字节计算

时间:2015-09-29 02:55:58

标签: python

我正在尝试实施更大的密码问题,而且我遇到的问题是我在采用最高有效字节(而不是位)时不太了解。

将int转换为我正在使用的字节:

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位获得最重要的字节,或者我错过了其他的傻事?

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

有更简单的方法可以做到这一点。例如,如果您想要前八位(忽略字节对齐),您可以执行以下操作:

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]

在Py2中,您必须转换为十六进制字符串并返回以匹配to_bytes方法。

答案 2 :(得分:0)

一个字节0xFF你可以通过

获得最有意义的字节(最左边)
i & (0xFF<<(n_bytes(i)-1))

如果你想让最右边的字节更容易

,我总是最重要,最不重要
i & 0xFF

我认为至少对...我不确定是否能保证返回字节数...

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

您也可以执行类似

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

答案 3 :(得分: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)