将C中的指针转换为C#

时间:2015-03-16 21:37:57

标签: c# c pointers

我需要将一些使用指针的C转换为C#。

Essentiay我获得了未格式化数据的缓冲区,需要对其进行处理 好像是否格式化了。它通常是从文件中读取的,但可能不是 它可能来自运行不同硬件的嵌入式C应用程序。

在这个例子中,我需要将它视为一个long数组。

I C我只需要创建一个pointe to long,然后转换缓冲区的地址。

但在C#中,我不能获取托管对象的地址 并且它不会让我将一个byte []转换为long []

所以如何在c#

中正确地做到这一点
void TestFunction(void)
{
    char buffer[256];
    PrintBufferAsLongPointer(buffer);
    PrintBufferAsLongArray(buffer);
}

void PrintBufferAsLongPointer(char *buffer)
{
    long *ptr = (long*)buffer;
    for(int count = 0; count < 64; count++)
    {
        printf(" %X", *ptr++);
    }
}

void PrintBufferAsLongArray(char *buffer)
{
    for(int index = 0; index < 64; index++)
    {
        printf(" %X", buffer[index]);
    }
}

3 个答案:

答案 0 :(得分:3)

如果你小心,你仍然可以在C#中使用指针(并在项目选项中启用'unsafe code'):

private static unsafe void PrintBufferAsLongArray(byte[] buffer)
{
    fixed (byte* pBuffer = buffer)
    {
        long* longData = (long*)pBuffer;
        for (int index = 0; index < 64; index++)
            Console.WriteLine(" {0:X}", longData[index]);
    }
}

答案 1 :(得分:2)

在c#中,内存管理由.net框架在许多组件的帮助下自动完成。其中之一是垃圾收集器,它负责清除未使用对象的内存。另一方面,在c中,存储器由程序员处理。程序员可以完全访问内存。他可以创建和破坏对象。他可以利用指针来引用程序虚拟内存中的某些位置等等。话虽这么说,我建议你避免将用c(或任何其他语言)编写的程序转换为c#中的程序。

首先,考虑一下你想要实现的内容,然后尝试找出如何用你选择的语言实现它。

我认为您需要的是以下内容:

void static PrintBuffersContents(char[] buffer)
{
    for(int index = 0; index < buffer.Length; index++)
    {
        Console.WriteLine(buffer[index])
    }
}

创建一个简单的控制台应用程序,您可以测试上述内容。

我想在此指出你可以在c#中使用指针。我声称这是不可能的。但是,这不是c#的重要组成部分。如果你能避免它们,我建议你这样做。这种语言的许多其他部分使得它在某些领域比c更强。有关c#中指针的详细说明,请查看here

答案 2 :(得分:1)

我认为BitConverter.ToInt32()正是您要找的。

以下程序打印1,2,257,514。

  static void PrintBufferAsInt(byte[] buffer)
  {
     for(int i = 0; i < buffer.Length; i+=4)
     {
        var value = BitConverter.ToInt32(buffer, i);
        Console.WriteLine(value);
     }
  }

  static void Main(string[] args)
  {
     var buffer = new byte[] {1, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0};
     PrintBufferAsInt(buffer);
  }