Python:https://www.python.org/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
十六进制字符串转 Python代码 (utf-8字符串转十六进制字符串)
目 录
- 1、试炼代码
- 2、十六进制字符串转utf-8代码函数
- 3、Python代码转十六进制字符串函数
- 4、试炼完整Python代码
- 5、代码运行效果
- 6、十六进制字符串转换值得注意的地方
在QQ“Python学习群”看到一条提问“如何把十六进制代码转换为原始文件呢”?刚好我前面“研究”一行装逼代码学到了一点相关技巧,在此记录个笔记,“抛砖引玉”🤪🤪
QQ提问截屏图片
正好今天在另一个Python学习群里“聒噪”,回答了一个小问题,有一段现成的Python代码:
小题目提问截屏图
解题Python代码
from random import choices # 加载random.choices()方法。
nums = range(1, 11) # 定义1~10的一维数组。
print(f"\n数组 {list(nums)} 长度:{len(nums)}") # 打印数组长度。
new_nums = choices(nums, k=3) # 随机从1~10中选取三个元素的新数组。
print(f"\n取数组 nums 随机三个元素求和:\n随机数组:{new_nums},求和sum:{sum(new_nums)}")
run代码效果截屏图片
就拿那段解小题的Python代码开刀试炼:先写个Python代码转十六进制字符串的函数,再写个将十六进制字符串的字符串转utf-8代码的函数。两个函数的语句都作了很详细的注释,这里就不再罗嗦了。“造好”这两个函数,就可以方便地进行“操刀”了。😁
Python代码转十六进制字符串函数
def to_hex(string):
''' 字符串转十六进制 '''
hex_string = [] # 初始化转换后的十六进制字符列表。
for i in string: # 遍历字符串。
hex_string.append(hex(ord(i))[2:].zfill(4).upper()) # 用“切片”[:3]方式截取转换后的十六进制字符串除十六进制标识字符外的字符串。由于有的中文字符需四位十六进制字符表示,所以用str.zfill(4)设置成每个字符四位十六进制字符(不足四位前置0)。为了好看,我用str.upper()方法转小写字母为大写。
return ''.join(hex_string) # 返回“无缝链接”后的十六进制字符串。
十六进制字符串转utf-8代码函数
def hex_to_chr(hex_string):
''' 十六进制字符转utf-8字符串 '''
chars = [] # 初始化转换后的utf-8字符串列表。
for i in zip(*[iter(hex_string)]*4): # 遍历十六进制字符串截取的四位十六进制字符元组。十六进制四位字符截取,用zip()、iter()配合*(星号)实现。
chars.append(chr(int(''.join(i), 16))) # 无缝拼接四个十六进制字符串,用int(hex_string, 16)内置函数转换成整数,再用内置函数chr(int_num)还原成字符。
return ''.join(chars) # 返回“无缝链接”转换后的utf-8字符串。
示例代码运行效果截屏图片
完成示例代码(跳过完整代码)
#!/sur/bin/nve python
# coding: utf-8
'''
filename = 'hex&utf-8.py'
author = 'dream elf cq'
date = '2022-08-14'
'''
def to_hex(string):
''' 字符串转十六进制 '''
hex_string = [] # 初始化转换后的十六进制字符列表。
for i in string: # 遍历字符串。
hex_string.append(hex(ord(i))[2:].zfill(4).upper()) # 用“切片”[:3]方式截取转换后的十六进制字符串除十六进制标识字符外的字符串。由于有的中文字符需四位十六进制字符表示,所以用str.zfill(4)设置成每个字符四位十六进制字符(不足四位前置0)。为了好看,我用str.upper()方法转小写字母为大写。
return ''.join(hex_string) # 返回“无缝链接”后的十六进制字符串。
def hex_to_chr(hex_string):
''' 十六进制字符转utf-8字符串 '''
chars = [] # 初始化转换后的utf-8字符串列表。
for i in zip(*[iter(hex_string)]*4): # 遍历十六进制字符串截取的四位十六进制字符元组。十六进制四位字符截取,用zip()、iter()配合*(星号)实现。
chars.append(chr(int(''.join(i), 16))) # 无缝拼接四个十六进制字符串,用int(hex_string, 16)内置函数转换成整数,再用内置函数chr(int_num)还原成字符。
return ''.join(chars) # 返回“无缝链接”转换后的utf-8字符串。
if __name__ == '__main__':
pycodes = '''
from random import choices # 加载random.choices()方法。
nums = range(1, 11) # 定义1~10的一维数组。
print(f"\n数组 {list(nums)} 长度:{len(nums)}") # 打印数组长度。
new_nums = choices(nums, k=3) # 随机从1~10中选取三个元素的新数组。
print(f"\n取数组 nums 随机三个元素求和:\n随机数组:{new_nums},求和sum:{sum(new_nums)}")
'''
hex_string = to_hex(pycodes)
print(f"\nPython代码字符串:\n{'-'*50}\n{pycodes}\n{'-'*50}\n转十六进制字符:\n{hex_string}")
print(f"\n将上面的十六进制字符串,转utf-8字符串:\n{'-'*50}\n{hex_to_chr(hex_string)}\n{'-'*50}")
明白——几个十六进制字符表示一个utf-8字符。如果没弄明白这一点,转换后的字符串“乱码”的几率是比较大的。本笔记示例Python代码中有大量的中文注释,所以我用四位十六进制字符来表示那段Python代码的每一个字符。英文字符是ASCII码,在0~255区间,仅用两位十六进制字符就可表示一个英文字符。中文字符则需要三、四个十六进制字符才可以表示。
实用技巧博文: