C# 使用位移位而不是位转换器浮动的字节数组
我正在接收包含浮点变量(32位)的字节数组。 在我的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) {
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”。