繁体   English   中英

将UINT64编码为浮点数

[英]Encode UINT64 to a float

我在C#中有将UInt64转换为float ,输入的值例如是'4537294320117481472'。 起作用的代码在第一个块中,第二个块显示相关功能,答案在底部。

byte[] rawParameterData = new byte[8];

Console.Write("Enter Value:  ");
string rawDataString = Console.ReadLine();
UInt64 rawParameterInteger = UInt64.Parse(rawDataString);

rawParameterData = ConvertFromUInt64(rawParameterInteger);

float convertedParameterData = ConvertToFloat(rawParameterData, 0);

rawParameterData现在等于[62,247,181,37,0,0,0,0]的字节数组

convertedParameterData现在等于0.4838039

public static byte[] ConvertFromUInt64(UInt64 data)
{
    var databuf = BitConverter.GetBytes(data);
    return SwapBytes(databuf, 8);   // DIS is big-endian; need to convert to little-endian: least significant byte is at lower byte location.
}

static float ConvertToFloat(byte[] data, int offset)
{
    var databuf = CopyData(data, offset, 4);
    return BitConverter.ToSingle(databuf, 0);
}


static byte[] SwapBytes(byte[] srcbuf, int datalength)
{
    var destbuf = new byte[srcbuf.Length];
    for (var i = 0; i < datalength; i++)
        destbuf[datalength - 1 - i] = srcbuf[i];
    return destbuf;
}

似乎代码依赖于C#的BitConverter.ToSingle(databuf, 0)函数。

可以用Python完成吗? 谢谢。

在python中,这很简单

import struct

a = 4537294320117481472

b = struct.pack('Q', a)
f = struct.unpack('ff', b)

print(f)  # (0.0, 0.4838038980960846)

https://docs.python.org/3/library/struct.html

import struct
import math 

# We only care about the first 4 of eight of the digits so we 
# need to shift by the character size * number of characters
# then we will just have databuf in our significantBits variable
# So we are converting from: 3E F7 B5 25 0 0 0 0 to 3E F7 B5 25
characterWidth = 8
significantBits = 4537294320117481472 >> (characterWidth * 4)

# We can use this python function convert from bits to a float
# Taken from https://stackoverflow.com/a/14431225/825093 
def bitsToFloat(b):
    s = struct.pack('>l', b)
    return struct.unpack('>f', s)[0]

float = bitsToFloat(significantBits)
print(float) # 0.483803898096

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM