brisonus_app_eq/communication/convert.py
2025-02-19 17:07:55 +08:00

62 lines
1.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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))