在数据处理中经常面临字节数据需要转换成不同位宽的十进制数据,尤其是在嵌入式处理中该现象特别常见,这里以转换为16位位宽的十进制为例,采用python校本进行数据转换,具体数据如下:
要将上面数据转换为双字节十进制数据,应该先划分出各个单字节数据,然后将单字节数据两两组合成为双字节数据,最后将双字节数据转换为十进制数据,具体实现如下:
import numpy as np
import ctypes
import soundfile as sf
import struct
import binascii
def readfile(filename):
f = open(filename,'r')
lines = f.readlines() #按行读取文件
data = []
for line in lines:
#line1 = line.split('\n')[0].strip()
line = line.strip().split('\n')[0]
line = line.split(' ') #分离出每一行的单字节
print('line = ',line)
new_line = []
if len(line) == 15: #特殊情况处理,由于给定的测试文本存在个别不规范格式数据
for i in range(0, len(line)):
if len(line[i]) == 4:
new_line.append(line[i][:2])
new_line.append(line[i][2:])
elif len(line[i]) == 3:
new_line.append(line[i][:1])
new_line.append(line[i][1:])
else:
new_line.append(line[i])
else:
new_line = line.copy()
line = new_line.copy()
print('newline = ',line)
for i in range(0, 16,2):
if line[i] == '':
line[i] = '00'
if line[i + 1] == '':
line[i + 1] = '00'
if len(line[i]) == 1:
line[i] = '0' + line[i]
if len(line[i + 1]) == 1:
line[i + 1] = '0' + line[i + 1]
byte_merge_str = line[i + 1] + line[i] #组合双字节数据
tmp_val = struct.unpack('<h', bytes.fromhex(byte_merge_str))[0] #转换为十进制数据
data.append(tmp_val)
data = np.array(data)
return data
filename = 'test.bin'
data = readfile(filename)
samplerate = 32000
sf.write('test.wav', data.clip(-32768,32767).astype(np.int16), samplerate)
上面程序是将单字节文本数据解析为双字节音频文件