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

时间:2015-07-15 21:46:31

标签: c# mono bit-manipulation bitwise-operators

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

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

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

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

2 个答案:

答案 0 :(得分:1)

让我们将BCL用于我们的目的:

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

您可以使用位移实现ToInt32

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

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

答案 1 :(得分:0)

为了摆脱C#传统方法并获得快速性能,您很可能必须实现“不安全”行为。你可以做类似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++;
}

这假设float的endianness与另一端的byte []相同。

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

float f;

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