我正在接收包含浮点变量(32位)的字节数组。
在我的C#应用程序中,我想使用按位移位将byte[] byteArray
转换为浮点数(因为它比BitConverter快得多)。
将字节数组转换为short
的方式如下:
short shortVal = (short)((short)inputBuffer [i++] << 8 | inputBuffer [i++]);
如何为浮点变量执行此操作?
答案 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));
}
}