将Double转换为Byte*

本文关键字:Byte 转换 Double | 更新日期: 2023-09-27 18:14:34

我需要一些c#代码将双精度类型转换为字节*。我知道我必须使用固定的(和不安全的?),但不完全确定如何…

将Double转换为Byte*

只要双变量具有堆栈作用域(局部变量或方法参数),就可以简单地使用指针强制转换。这是有效的,因为堆栈范围变量不受垃圾收集器移动的影响,因此不需要固定。避免必须先将双精度转换为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