将Double转换为Byte*
本文关键字:Byte 转换 Double | 更新日期: 2023-09-27 18:14:34
我需要一些c#代码将双精度类型转换为字节*。我知道我必须使用固定的(和不安全的?),但不完全确定如何…
只要双变量具有堆栈作用域(局部变量或方法参数),就可以简单地使用指针强制转换。这是有效的,因为堆栈范围变量不受垃圾收集器移动的影响,因此不需要固定。避免必须先将双精度转换为byte[]
。同样的限制适用于fixed
关键字,指针只在方法体内部有效:
unsafe void Foo(double d) {
byte* ptr = (byte*)&d;
// Use ptr
//...
}
与BitConverter类完全相同
你可以这样做:
unsafe
{
fixed (byte* b = BitConverter.GetBytes(1.2d))
{
// Do stuff...
}
}
或:
public unsafe void YourMethod(double d)
{
fixed (byte* b = BitConverter.GetBytes(d))
{
// Do stuff...
}
}
使用BitConverter。GetBytes方法:http://msdn.microsoft.com/en-us/library/a5be4sc9.aspx
double d = 2.0;
byte[] array = BitConverter.GetBytes(d);
编辑:如果你需要一个c风格的字节*使用:
double d = 2;
byte[] array = BitConverter.GetBytes(d);
IntPtr ptr = Marshal.AllocHGlobal(sizeof(byte) * array.Length);
Marshal.Copy(array, 0, ptr, array.Length);
unsafe
{
byte* pointer = (byte*)ptr;
}
可以从使用BitConverter.GetBytes()
正如这里大多数人所说,您可以使用fixed或BitConverter来完成此操作。但最重要的是,不要。如果您需要数据编组,. net将为您完成。在大多数情况下,您不希望将对托管内存的引用传递给非托管函数(因为您将无法控制数据或引用的状态)。'Fixed'将确保在作用域中,数据不会被垃圾收集器移动或释放,并且您将获得指针。然而,在固定块之外,非托管代码可能仍然具有该指针,即使该指针可能已被垃圾收集器失效,这将立即使您的应用程序在没有任何明显原因的情况下失败。
在。net中,通过使用不安全代码很少能获得任何有利的性能提升,并且将对托管数据的引用传递给非托管代码也并不总是有利的。
但是有几个答案:
byte value = 255;
unsafe
{
byte* ptr = &value; // Assign the address of value to ptr
SomeUnsafeCode(ptr);
}
你不需要使用固定的堆栈分配变量,因为它们不会被垃圾收集。
对于垃圾收集变量,您将需要fixed:
byte[] array = SomeGenerator();
unsafe
{
fixed(byte* ptr = array)
{
SomeUnsafeCode(ptr);
}
}
这将把数组固定在内存中,以便在固定数组时抓取收集器不会接触数组。
有时候你想把数据固定在几个代码块上。在这种情况下,您需要使用System.Runtime.InteropServices.GCHandle
。