将byte[]转换为float[]的最快方法是什么?反之亦然
本文关键字:方法 是什么 反之亦然 float byte 转换 | 更新日期: 2023-09-27 18:04:24
这是将byte[]转换为float[]的最快方式,反之亦然(当然没有循环)。
我现在使用BlockCopy,但我需要双内存。我想要一些演员。
我需要做这个转换,只是为了通过套接字发送数据,并在另一端重建数组。
当然,微软的提案也会复制。如果你不想复制,你说的只是改变。net考虑内存区域的方式。
但是,我不认为你想要的是可能的,因为字节和浮点数在内存中的表示完全不同。一个字节在内存中正好使用一个字节,但是浮点数使用4个字节(32位)。
如果你不需要内存来存储你的数据,那就把数据表示为你在内存中使用最多的数据类型,并在你使用它们时转换你实际使用的值。
如何将浮点数(可以表示±1.5 × 10−45和±3.4 × 10^38之间的值)转换为字节(可以表示0到255之间的值)?
(查看更多关于:
- 字节:http://msdn.microsoft.com/en-us/library/5bdb6693 (v = VS.100) . aspx
- 浮动:http://msdn.microsoft.com/en-us/library/b1e65aza.aspx
关于。net中浮动类型的更多信息:http://csharpindepth.com/Articles/General/FloatingPoint.aspx
你可以使用StructLayout来实现这一点(从Stack Overflow问题 c#不安全的值类型数组到字节数组的转换):
[StructLayout(LayoutKind.Explicit)]
struct UnionArray
{
[FieldOffset(0)]
public Byte[] Bytes;
[FieldOffset(0)]
public float[] Floats;
}
static void Main(string[] args)
{
// From bytes to floats - works
byte[] bytes = { 0, 1, 2, 4, 8, 16, 32, 64 };
UnionArray arry = new UnionArray { Bytes = bytes };
for (int i = 0; i < arry.Bytes.Length / 4; i++)
Console.WriteLine(arry.Floats[i]);
}
IEnumerable<float> ToFloats(byte[] bytes)
{
for(int i = 0; i < bytes.Length; i+=4)
yield return BitConverter.ToSingle(bytes, i);
}
如果您可以访问LINQ,有两种方法:
var floatarray = ByteArry.AsEnumerable.Cast<float>().ToArray();
或者仅仅使用数组函数
var floatarray = Array.ConvertAll(ByteArray, item => (float)item);