Search code examples
floating-pointgodotgdscript

Convert PoolByteArray to float


My code currently calculates the single-precision float manually based on the IEEE 754 specs. However, in languages like C, this entire operation is effectively a nop. Is there a better (faster) way to do this conversion?

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

I tried using some of the Data Packet classes, but they seem to require an entire protocol setup to use.


Solution

  • The StreamPeerBuffer can be used to do the conversion, by writing the bytes into it, an then retrieving a float.

    func bin2float(pkt:PoolByteArray) -> float:
        var buff = StreamPeerBuffer.new()
        buff.data_array = pkt
        return buff.get_float()
    

    Source: https://godotengine.org/qa/81109