Laden...

byte * to byte[]

Erstellt von Vertexwahn vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.826 Views
V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren
byte * to byte[]

geht das byte * to byte[]?

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Vertexwahn!

Vielleicht wären ein paar wenig mehr Angaben sinnvoll?

Redest Du hier von C++, oder reines C# oder möchtest Du eine C++-Dll-Methode aufrufen, in der Du diese Wandlung benötigst...?

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren

Vielleicht wären ein paar wenig mehr Angaben sinnvoll?

Eine Funktion getBuffer (in C# geschrieben), auf die ich keinen Einfluss habe, liefert mir den Typ byte *

Eine andere Funktion foo (auch in C# geschrieben), auf die ich auch keinen Einfluss habe, will als Parameter byte[]

ich weiß das hinter dem byte * immer ein Array steckt mit 100 Elementen

Derzeitige Lösung:


byte[] data = new byte[100];
byte * buffer = getBuffer();
unsafe
{
     for(int i = 0; i < 100; i++)
          data[i] = buffer[i];
}
foo(data);

muss ich das wirklich immer umkopieren oder kann ich das nicht einfach irgendwie casten?

4.221 Beiträge seit 2005
vor 18 Jahren

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren

irgendwie hilft mir der Link auch nicht weiter - hab keine Ahnung wie ich das umbauen soll...


using System;

class Byte
{
	static byte * getBuffer()
	{
		unsafe
		{
			byte * buffer = stackalloc byte[100];
							
			for(byte i = 0; i < 100; i++)
				buffer[i] = i;

			return buffer;
		}
	}

	static void Main(string[] args)
	{
		byte[] data = new byte[100];
		
		unsafe
		{
			byte * buffer = getBuffer();

			for(int i = 0; i < 100; i++)
				data[i] = buffer[i];
		}
		
		foreach(byte b in data)
			System.Console.WriteLine(b);

		Console.ReadLine();
	}
}

M
1.439 Beiträge seit 2005
vor 18 Jahren

Hi, Dein GetBuffer() wird nicht funktionieren, da buffer beim Verlassen von GetBuffer nicht mehr existiert!
siehe http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfstackalloc.asp

lg
georg

V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren

In meinen Buch fehlte diese Information - da stand nur:

In an unsafe context, you may need to declare a local variable that allocates memory directly from the call stack (and is therefore not subject to .NET garbage collection). To do so, C# provides the "stackalloc" keyword, which is the C# equivalent to the _alloca function of the C runtime library. Here is a simple example

in meinem Programmcode sieht es so aus:

[DllImport("MyDll.dll") EntryPoint="getBuffer"]
static extern byte * getBuffer();

also mein Problem liegt nicht bei dem stackalloc - ich wollte nur ein Beispiel geben an dem man mein Problem schön sehen kann

V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren

mmh anscheinend kann man ein byte* in ein byte[] nur durch umkopieren umwandlen