我需要将一些使用指针的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]);
}
}
答案 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()
正是您要找的。 p>
以下程序打印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);
}