brisonus_app_eq/ERNCTuningTool/communication/convert.py

62 lines
1.6 KiB
Python
Raw Permalink Normal View History

2025-02-18 22:05:52 +08:00
import struct
from select import select
def int16_to_float(high, low):
# 将两个 16 位整数合并为一个 32 位整数
combined = (high << 16) | (low & 0xFFFF)
# 将 32 位整数解释为浮点数
float_value = struct.unpack('>f', struct.pack('>I', combined))[0]
return float_value
def float_to_int16(value):
# 将浮点数打包为 32 位整数字节
packed = struct.pack('>f', value)
# 解包成 32 位整数
combined = struct.unpack('>I', packed)[0]
# 分离出高 16 位和低 16 位
high = (combined >> 16) & 0xFFFF
low = combined & 0xFFFF
return high, low
def int16_to_float_n(vals):
# 给出的vals是一个数的列表其长度必须是2的整数倍
_val_num = int(len(vals) / 2)
_float_vals = []
for i in range(_val_num):
_float_vals.append(int16_to_float(vals[i * 2], vals[i * 2 + 1]))
return _float_vals
def float_to_int16_n(vals):
"""
将多个float类型数转换为一个int16类型数的list
:param vals: float类型数的list
:return: int16类型数的list
"""
_val_num = len(vals)
_int_vals = []
for i in range(_val_num):
_int_vals = _int_vals + [*float_to_int16(vals[i])]
return _int_vals
if __name__ == '__main__':
# 示例
high = 0x3f80 # 16 位高位
low = 0x0000 # 16 位低位
result = int16_to_float(high, low)
print(result)
high, low = float_to_int16(result)
print(high, low)
float_val_1 = 0.1
print(float_to_int16(float_val_1))
float_vals = [0.1, 0.2]
print(float_to_int16_n(float_vals))