62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
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))
|
||
|