Pythonhttps://www.python.org/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


python读取dat十六进制文件 python读取16进制字符串_python读取dat十六进制文件



十六进制字符串转 Python代码 (utf-8字符串转十六进制字符串)



目 录


  • 1、试炼代码
  • 2、十六进制字符串转utf-8代码函数
  • 3、Python代码转十六进制字符串函数
  • 4、试炼完整Python代码
  • 5、代码运行效果
  • 6、十六进制字符串转换值得注意的地方

  在QQ“Python学习群”看到一条提问“如何把十六进制代码转换为原始文件呢”?刚好我前面“研究”一行装逼代码学到了一点相关技巧,在此记录个笔记,“抛砖引玉”🤪🤪

QQ提问截屏图片

python读取dat十六进制文件 python读取16进制字符串_十六进制_02



  正好今天在另一个Python学习群里“聒噪”,回答了一个小问题,有一段现成的Python代码:

小题目提问截屏图

python读取dat十六进制文件 python读取16进制字符串_十六进制_03


解题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读取dat十六进制文件 python读取16进制字符串_python_04


python读取dat十六进制文件 python读取16进制字符串_python_05



  就拿那段解小题的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字符串。

示例代码运行效果截屏图片

python读取dat十六进制文件 python读取16进制字符串_十六进制_06


完成示例代码(跳过完整代码)

#!/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区间,仅用两位十六进制字符就可表示一个英文字符。中文字符则需要三、四个十六进制字符才可以表示。









实用技巧博文: