我需要将存储为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#不喜欢这样......有更好的方法吗?
答案 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!