关于二进制,八进制和十六进制的转换和输出
如果要将一个整数转换为二进制,八进制或十六进制的文本字符串形式,只要分别使用内建的bin(), oct()和hex()函数就好,举个例子:
>>> x = 1234567890
>>> bin(x)
'0b1001001100101100000001011010010'
>>> oct(x)
'0o11145401322'
>>> hex(x)
'0x499602d2'
>>>
当然,如果你不喜欢出现0b,0o, 0x这样的字符,你可以使用format()函数:
>>> format(x, 'b')
'1001001100101100000001011010010'
>>> format(x, 'o')
'11145401322'
>>> format(x, 'x')
'499602d2'
>>>
当然,整数是有符号的,因此如果要处理负数的话,输出中也带上了一个符号:
>>> x = -1234567890
>>> format(x, 'b')
'-1001001100101100000001011010010'
>>>
如果你需要产生一个无符号的数值,你就需要加上最大值来设置比特位的长度,如果要将字符串形式的整数转换为不同的进制,只需要使用int()函数再配合适当的进制就好。
def bin_octal():
x = 1234
print(type(bin(x)))
print(bin(x), oct(x), hex(x))
# format() function
print(format(x, 'b'))
print(format(x, 'o'))
print(format(x, 'x'))
print(int('4d2', 16))
print(int('10011010010', 2))
if __name__ == '__main__':
bin_octal()
从字节串中打包和解包大整数
假设我们有一个字节串,需要将其解包为一个整形数值,并且我们还需要将一个大整数打包为一个字符串。对于这种情况,我们先拆开分步来。
对于第一个问题,我们可以直接调用int.from_bytes()然后直接指定字节序就好:
>>> data = b'\x00\x123V\x00x\x90\xab\x00\xcd\x3f\x01\x00#\x004'
>>> len(data)
>>> int.from_bytes(data, 'little')
69120565665538368633411373192346538496
>>> int.from_bytes(data, 'big')
94502560111143632816500266485612596
>>>
如果要将一个大的整数重新转换为字符串,可以使用int.to_bytes()方法,只需要指定字节数和字节序就好:
>>> x = 6413675734567813446589673457863489571
>>> x.to_bytes(16, 'big')
b'\x04\xd3:\xa0\xbbtK-`\x06\x96]\xe6\xc5\xf8#'
>>> x.to_bytes(16, 'little')
b'#\xf8\xc5\xe6]\x96\x06`-Kt\xbb\xa0:\xd3\x04'
>>>
在大整数和字节串之间相互转换的确不是什么常见的操作,但是有时候在特定应用的领域中会有这样的需求。在代码中是这样的:
def int_bytes():
data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
print(len(data))
print(int.from_bytes(data, 'little'))
print(int.from_bytes(data, 'big'))
x = 94522842520747284487117727783387188
print(x.to_bytes(16, 'big'))
print(x.to_bytes(20, 'big'))
# bit_length真有用
x = 523 ** 23
print(x)
print(x.bit_length())
nbytes, rem = divmod(x.bit_length(), 8)
if rem:
nbytes += 1
print(x.to_bytes(nbytes, 'little'))
if __name__ == '__main__':
int_bytes()
复数运算
我们的代码在同最新的web认证方案交互的时候遇到了奇点,照正常操作是在复平面里解决,但是也许只需要利用负数就可以完成。
复数可以通过complex(real, imag)函数来指定,或者可以通过浮点数再加上后缀j来指定也不是不行。举个例子:
in__':
complex_math()