我有一些单精度和双精度浮点数,想要将它们写入和读取自一个字节数组byte[]。在.Net中是否有可以将它们转换为32位和64位IEEE 754表示的方法?
我有一些单精度和双精度浮点数,想要将它们写入和读取自一个字节数组byte[]。在.Net中是否有可以将它们转换为32位和64位IEEE 754表示的方法?
.NET的Single和Double已经采用了IEEE-754格式。你可以使用BitConverter.ToSingle()和ToDouble()将byte[]转换为浮点数,GetBytes()则可以完成相反的操作。
使用span更新当前的.NET/C#:
static void Main()
{
Span<byte> data = stackalloc byte[20];
GetBytes(0, data, 0);
GetBytes(123.45F, data, 4);
GetBytes(123.45D, data, 8);
}
static unsafe void GetBytes(float value, Span<byte> buffer, int offset)
=> MemoryMarshal.Cast<byte, float>(buffer.Slice(offset))[0] = value;
static unsafe void GetBytes(double value, Span<byte> buffer, int offset)
=> MemoryMarshal.Cast<byte, double>(buffer.Slice(offset))[0] = value;
如果您不想一直分配新的数组(这就是GetBytes
的做法),您可以使用unsafe
代码直接写入缓冲区:
static void Main()
{
byte[] data = new byte[20];
GetBytes(0, data, 0);
GetBytes(123.45F, data, 4);
GetBytes(123.45D, data, 8);
}
static unsafe void GetBytes(float value, byte[] buffer, int offset)
{
fixed (byte* ptr = &buffer[offset])
{
float* typed = (float*)ptr;
*typed = value;
}
}
static unsafe void GetBytes(double value, byte[] buffer, int offset)
{
fixed (byte* ptr = &buffer[offset])
{
double* typed = (double*)ptr;
*typed = value;
}
}
Span<byte>
API,并且完全不需要任何 unsafe
和任何数组分配(使用 stackalloc
span)- 请参见编辑。 - Marc Gravell