将 PoolByteArray 转换为浮点数
Convert PoolByteArray to float
我的代码目前根据 IEEE 754 规范手动计算单精度浮点数。然而,在像 C 这样的语言中,整个操作实际上是一个 nop
。有没有更好(更快)的方法来进行这种转换?
func bin2float(pkt:PoolByteArray) -> float:
#Convert packet to an array of bools
var arr:Array=[]
for byte in pkt:
for _i in range(0,8):
arr.append(byte%2)
byte/=2
#Extract sign
var r_sign:int
if arr[31]==1:
r_sign=-1
else:
r_sign=1
#Extract exponent
var r_exp:int=0
for i in range(30,22,-1):
r_exp*=2
r_exp+=arr[i]
r_exp-=127
#Extract mantissa
var r_mant:float=0
for i in range(0,23):
r_mant+=arr[i]
r_mant/=2
r_mant+=1
return r_sign*pow(2,r_exp)*r_mant
我尝试使用一些数据包 类,但它们似乎需要完整的协议设置才能使用。
StreamPeerBuffer
可用于进行转换,方法是将字节写入其中,然后检索浮点数。
func bin2float(pkt:PoolByteArray) -> float:
var buff = StreamPeerBuffer.new()
buff.data_array = pkt
return buff.get_float()
我的代码目前根据 IEEE 754 规范手动计算单精度浮点数。然而,在像 C 这样的语言中,整个操作实际上是一个 nop
。有没有更好(更快)的方法来进行这种转换?
func bin2float(pkt:PoolByteArray) -> float:
#Convert packet to an array of bools
var arr:Array=[]
for byte in pkt:
for _i in range(0,8):
arr.append(byte%2)
byte/=2
#Extract sign
var r_sign:int
if arr[31]==1:
r_sign=-1
else:
r_sign=1
#Extract exponent
var r_exp:int=0
for i in range(30,22,-1):
r_exp*=2
r_exp+=arr[i]
r_exp-=127
#Extract mantissa
var r_mant:float=0
for i in range(0,23):
r_mant+=arr[i]
r_mant/=2
r_mant+=1
return r_sign*pow(2,r_exp)*r_mant
我尝试使用一些数据包 类,但它们似乎需要完整的协议设置才能使用。
StreamPeerBuffer
可用于进行转换,方法是将字节写入其中,然后检索浮点数。
func bin2float(pkt:PoolByteArray) -> float:
var buff = StreamPeerBuffer.new()
buff.data_array = pkt
return buff.get_float()