使用按位移位而不是 BitConverter 浮动的字节数组

Byte-array to float using bitwise shifting instead of BitConverter

我正在接收包含浮点变量(32 位)的字节数组。 在我的 C# 应用程序中,我想使用按位移位将 byte[] byteArray 转换为浮点数(因为它比 BitConverter 快得多)。

将字节数组转换为 short 的工作方式如下:

short shortVal = (short)((short)inputBuffer [i++] << 8 | inputBuffer [i++]);

如何为浮点变量执行此操作?

让我们对 BCL 进行内脏处理并将其内脏用于我们的目的:

    unsafe public static float ToSingle (byte[] value, int startIndex)
    {
        int val = ToInt32(value, startIndex);
        return *(float*)&val;
    }

您可以使用移位实现 ToInt32

如果您不需要字节顺序行为,单个不安全访问可以为您提供浮点数(假设它已对齐)。

或者,您可以使用联合结构将 int 转换为 float。

要摆脱 C# 常规方法并获得快速性能,您很可能必须实施 "unsafe" 行为。你可以做一些像 C 风格的内存复制。

unsafe public static void MemoryCopy (void* memFrom, void* memTo, int size) {
    byte* pFrom = (byte*)memFrom;
    byte* pTo = (byte*)memTo;
    while (size-- >= 0)
        *pTo++ = *pFrom++;
}

这假设进入 byte[] 的浮点数字节顺序与另一端相同。

要使用它,您必须首先修复字节数组,因为运行时可以在垃圾回收期间随时移动它。像这样:

float f;

unsafe {
    fixed (byte* ptr = byteArray) {
        MemoryCopy (ptr, &f, sizeof(float));
    }
}