我正在尝试实施更大的密码问题,而且我遇到的问题是我在采用最高有效字节(而不是位)时不太了解。
将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位获得最重要的字节,或者我错过了其他的傻事?
答案 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)