Today I would like to provide a commend way to solve a question:将二/八/十/十六进制转为字符串。在CTF编码题中遇到,以此记录。
下面为二进制translate to string的一个例子:
binary_str = "01101011011011110110010101101011011010100011001101110011"
integer = int(binary_str, 2) # 将二进制字符串转换为整数
byte_arr = integer.to_bytes((integer.bit_length() + 7) // 8, 'big') # 将整数转换为字节序列
print(byte_arr.decode())
解释:
binary_str用来存储N进制的字符串(比如这里为二进制)
integer用来接受整数,byte_arr就是字符串啦
在 Python 的
int()
函数中,第二个参数表示输入字符串的基数(radix)。基数定义了输入字符串所使用的数字系统,常见的基数有二进制(base
2)、十进制(base 10)、十六进制(base 16)等。 当第二个参数设置为 2
时,表示输入字符串是一个二进制数字。函数会将二进制字符串解析为对应的整数。 例如,int('1010', 2)
将返回整数
10
,因为输入的字符串'1010'
是一个二进制数字,对应的十进制数值为10
。 如果不指定第二个参数,默认情况下
int()
函数会将输入字符串解析为十进制数字。例如,int('100')
将返回整数100
,因为输入的字符串'100'
是一个十进制数字。
所以还可简化:
integer=0b01101011011011110110010101101011011010100011001101110011
byte_arr = integer.to_bytes((integer.bit_length() + 7) // 8, 'big') # 将整数转换为字节序列
print(byte_arr.decode())
二进制:0b 八进制:0o 十六进制:0x(加N进制前面)
下面是重要函数:
当将整数转换为字节序列时,使用 integer.to_bytes()
方法。它接受两个参数:字节长度和字节顺序。
-
字节长度:
(integer.bit_length() + 7) // 8
integer.bit_length()
返回整数的二进制表示中的位数(位数不包括符号位)。+ 7
是为了确保在字节数计算时考虑到整数可能需要多占用一个字节的情况。// 8
是将位数转换为字节数。
这样计算出的字节长度确保可以容纳整数的二进制表示,同时避免浪费空间。
-
字节顺序:
'big'
'big'
表示采用大端字节顺序,也就是最高有效位的字节排在最前面。'little'
表示采用小端字节顺序,最低有效位的字节排在最前面。
最终,integer.to_bytes()
返回一个字节序列,对应于输入的整数。将其赋值给 byte_arr
变量。
这样,您就可以将二进制字符串解析为整数,并将整数转换为对应的字节序列。
除此之外,单独提供一种十六进制的另外方法:
str="63746673686f777b77656c636f6d655f325f636169676f755f6375707d"
str=bytes.fromhex(str)
print(str)
print(str.decode())
bytes.fromhex() 是一个 Python 的方法,用于将十六进制字符串转换为字节序列(bytes 对象)。该方法将输入的十六进制字符串解析为一系列十六进制数字,并将其转换为对应的字节