|
楼主 |
发表于 2025-1-17 11:09:38
|
显示全部楼层
- import binascii
- import math
- #让16进制后面加上对应的ascii码
- def hex_to_ascii_with_dots(hex_string):
- # 确保十六进制字符串的长度是偶数,如果不是,则需要在前面补零
- if len(hex_string) % 2 != 0:
- hex_string = '0' + hex_string
-
- ascii_string = []
- for i in range(0, len(hex_string), 2):
- # 获取两个十六进制字符并转换为整数
- hex_byte = hex_string[i:i+2]
- byte_value = int(hex_byte, 16)
-
- # 如果字节值小于或等于 127,则转换为 ASCII 字符,否则显示为 '.'
- if byte_value <= 127 and byte_value>18:
- ascii_char = chr(byte_value)
- else:
- ascii_char = '.'
-
- ascii_string.append(ascii_char)
-
- # 将列表转换为字符串并返回
- return ''.join(ascii_string)
- #将16进制文件保存为wav
- def hex_string_to_wav(hex_string, output_file):
- # 去掉可能存在的空格或换行符,并检查字符串长度是否为偶数
- hex_string = hex_string.replace(" ", "").replace("\n", "").replace("\r", "")
- if len(hex_string) % 2 != 0:
- raise ValueError("Hex string length must be even")
-
- # 将16进制字符串转换为字节数组
- byte_array = bytearray.fromhex(hex_string)
-
- # 将字节数组写入文件
- with open(output_file, 'wb') as file:
- file.write(byte_array)
- #让16进制文件两个成对显示,符合8位习惯
- def printHexdata(hex_data,numPerLine = 32):
- for i in range(round(len(hex_data)/numPerLine)):
- for j in range(round(numPerLine/2)):
- print(hex_data[numPerLine*i:numPerLine*(i+1)][j*2:j*2+2],end = ' ')
- print(hex_to_ascii_with_dots(hex_data[numPerLine*i:numPerLine*(i+1)]))
- #生成正弦信号,也就是电子音
- def change_hexdata(hex_data):
- new_hexdata = hex_data[0:88]
- for i in range(44,round(len(hex_data)/2)):
- new_hexdata=new_hexdata + hex(round(120+50*math.sin(16*i/180*math.pi)))[2:]
- return new_hexdata
- file_path = 'a.wav' # 指定文件路径
- with open(file_path, 'rb') as file: # 以二进制模式打开文件
- data = file.read() # 读取整个文件内容
- hex_data = binascii.hexlify(data).decode('utf-8') # 将数据转换为16进制字符串
- #print(type(hex_data))
-
- #print(hex_data) # 打印16进制内容
- printHexdata(hex_data[0:320])
- print('修改后')
- print(len(hex_data))
- hex_data = change_hexdata(hex_data)
- print(len(hex_data))
- printHexdata(hex_data[0:320])
- hex_string_to_wav(hex_data, 'output.wav')
- pass # 此处留空,后续步骤将在文件上下文中进行
复制代码 |
|