使用按位移位而不是 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));
}
}
我正在接收包含浮点变量(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));
}
}