Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用位移位而不是位转换器浮动的字节数组_C#_Mono_Bit Manipulation_Bitwise Operators - Fatal编程技术网

C# 使用位移位而不是位转换器浮动的字节数组

C# 使用位移位而不是位转换器浮动的字节数组,c#,mono,bit-manipulation,bitwise-operators,C#,Mono,Bit Manipulation,Bitwise Operators,我正在接收包含浮点变量(32位)的字节数组。 在我的C#应用程序中,我想使用按位移位将byte[]byteArray转换为浮点(因为它比位转换器快得多) 将字节数组转换为short的工作原理如下: short-shortVal=(short)((short)inputBuffer[i++]让我们将BCL取出,并将其肠道用于我们的目的: unsafe public static float ToSingle (byte[] value, int startIndex) {

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

将字节数组转换为
short
的工作原理如下:


short-shortVal=(short)((short)inputBuffer[i++]让我们将BCL取出,并将其肠道用于我们的目的:

    unsafe public static float ToSingle (byte[] value, int startIndex)
    {
        int val = ToInt32(value, startIndex);
        return *(float*)&val;
    }
您可以使用位移位实现
到Int32

如果您不需要endianness行为,那么一个不安全的访问可以为您提供浮动(假设它是对齐的)

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

要摆脱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++;
}
这假设浮点的endianness在字节[]中与在另一端相同

要使用它,您必须首先修复字节数组,因为运行时可以在垃圾收集过程中随时移动它。类似如下:

float f;

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

你可以用float做同样的事情,至少对我来说,如果我理解你的问题rightBitConverter。你可以复制代码并删除契约检查、big-endian分支等。如果你还没有实现它,你怎么知道一种方法更快?你是如何衡量它更快的?codereview上给我提示的人是kind足以提供快速比较,请参见此处。您可以解释此构造:
*(float*)&val;
?它看起来像是一个不安全的内存访问的
联合体。这只是将int字节视为一个浮点体。这是对这些字节的重新解释。如果您更喜欢,可以使用联合体结构思想来实现。搜索“c#union”。