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