高性能8字节十六进制到浮点值转换?

时间:2013-02-05 22:49:03

标签: c# performance type-conversion

我需要将存储为8个字符的十六进制字符串的大量值转换为C#程序中的浮点值。性能至关重要,因为代码每秒最多可调用50,000次。

至于功能,Python代码:

f = struct.unpack('<f', bytes.fromhex(strng))[0]

做我需要的。我尝试过“无聊”版本:

byte[] raw = BitConverter.GetBytes(int.Parse(hex, NumberStyles.HexNumber));
Array.Reverse(raw);
float f = BitConverter.ToSingle(raw, 0);

但这非常慢。我尝试使用代码here对其进行优化 并使用表查找和c#指针,并以这种方式调用它:

byte[] raw = FastHex.FromHexString(hex);
float f = BitConverter.ToSingle(raw, 0);

这对于hext-to-byte []转换非常有用,但仍然涉及非本地byte []数组的创建和销毁。我想知道我是否可以直接从byte []到FromHexString()代码末尾的“float”值。也就是说,我希望能够做到:

fixed (float* floatptr = (float*)result)
    return *floatptr;

其中result是包含结果的byte [4],但C#不喜欢这样......有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我认为这可能会成功:

float f = (float)System.Net.IPAddress.NetworkToHostOrder(
    BitConverter.ToInt32(bytes, 0));

答案 1 :(得分:0)

        // This works for a two byte string, possibly more ;-)
        string hex = "FF";
        //
        float f = (float) Convert.ToInt32(hex, 16);
        //
        // f is now 255, yahoo!