Python 最高有效字节计算
我正试图实现一个更大的密码问题,但在获取最高有效字节(不是位)时遇到了一个我不太理解的问题 要将int转换为我正在使用的字节,请执行以下操作: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
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,您应该查看位字符串
模块,该模块将为您处理操作位字符串并将其转换为整数的所有繁琐细节。谢谢,这似乎是一种更好的方法,我想我需要对位运算做更多的研究!