最高有效字节计算

2024-04-27 21:16:47 发布

您现在位置: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位就可以得到最有意义的字节,还是我遗漏了一些愚蠢的东西?


Tags: 密码returnif字节def错误数字else
3条回答

示例代码只获取前导位,而不是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个。

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

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方法。

字节是0xFF您可以通过执行

i & (0xFF<<(n_bytes(i)-1))

如果你想让最右边的字节更容易,我总是感到最重要和最不重要的混淆

i & 0xFF

我想这至少是对的。。。我不确定是否能保证返回字节数。。。

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

你也可以做些类似的事情

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

相关问题 更多 >