Python 最高有效字节计算

Python 最高有效字节计算,python,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 >&g

我正试图实现一个更大的密码问题,但在获取最高有效字节(不是位)时遇到了一个我不太理解的问题

要将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
我很确定上面的说法是正确的,它适用于我的测试数据。然后提取我使用的最高有效字节:

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位就可以得到最重要的字节,是我错了,还是我遗漏了一些愚蠢的东西?

一个字节是
0xFF
你可以通过这样做得到最重要的字节(最左边的)

i & (0xFF<<(n_bytes(i)-1))
我想这至少是对的。。。我不确定它是否保证返回字节数

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

你也可以这样做

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

示例代码只获取七个前导位,而不是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)
def msb(val):
    return val.to_bytes((val.bit_length() + 7) // 8, 'big')[0]
对于最重要的对齐字节,在Python 3中可以执行以下操作:

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

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

如果您想要对齐字节,这至少应该从Python 2.5开始工作:

def msb(val):
    return 0 if val == 0 else val >> (((val.bit_length() - 1) >> 3) << 3)

sys.getsizeof
返回的数字对于这种特殊情况基本上是无用的。这是Python分配的大小(包括对象结构),它只与
i
的大小松散地联系在一起。。。i gues numbits/8目标是获取最上面对齐的字节,还是设置最高的8位?这有很大的不同。该死,我已经有一段时间没有使用python了,我忘记了数组索引…非常感谢,现在它工作得非常好!很好的回答:)这是他的代码的实际问题,我想。。。矿山提供了一种不同的方法solve@user2851268,您应该查看
位字符串
模块,该模块将为您处理操作位字符串并将其转换为整数的所有繁琐细节。谢谢,这似乎是一种更好的方法,我想我需要对位运算做更多的研究!