我有一些单精度和双精度浮点数,我想写入和读取字节 []。.Net 中有什么东西可以用来将它们转换为 32 位和 64 位 IEEE 754 表示吗?
问问题
15905 次
2 回答
36
.NET Single 和 Double 已经采用 IEEE-754 格式。您可以使用BitConverter.ToSingle()和ToDouble()将 byte[] 转换为浮点数,GetBytes()反过来。
于 2010-11-22T19:34:05.630 回答
9
使用 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;
}
}
于 2014-07-01T13:20:04.907 回答