Jochen Kühner
Level-3
- Beiträge
- 4.303
- Reaktionspunkte
- 530
Das würde ich in einer .NET-Anwendung nicht tun. Warum programmierst du dir das Lesen aufeinanderfolgender Blöcke nicht eben selbst? Du kannst den C-Code von daveReadManyBytes zum Vorbild nehmen.Wollte in meinem nodaveprotokoller read bytes durch read many bytes ersetzen, doch das funzt irgendwie so nicht!
Die mit from lesen von einem eigenen Puffer (also aus dem Speicher der Anwendung).Habe irgendwo hier auch gelsen das ich dann die funktionen getU8from
(also die mit from)
Das kannst du gerne versuchen, aber die Funktionen sind genau deshalb nicht in der .net.dll, weil der Austausch von Zeigern zwischen C und .NET problematisch sein kann/könnte.Muss ich mir die .net lib dann mit diesen funktion selbst übersetzen, weil in der standart sind diese ja nicht drin (soweit ich gesehen habe)
[DllImport("libnodave.dll"/*, PreserveSig=false */ )]
protected static extern int daveGetS32from(Byte[] Buffer);//[MarshalAs(UnmanagedType.LPStr)]
public int getS32from(Byte[] Buffer)
{
return daveGetS32from(Buffer);
}
public byte[] readManyBytes(int area, int DBnumber, int start, int len, byte[] buffer)
{
int res, readLen;
byte[] myBuffer;
byte[] tmp;
//uc * pbuf;
//pos=0;
//if (buffer==NULL) return daveResNoBuffer;
//pbuf=(uc*) buffer;
//res = daveResInvalidLength; //the only chance to return this is when len<=0
while (len > 0)
{
if (len > getAnswLen() - 18) readLen = getAnswLen() - 18; else readLen = len;
res = daveReadBytes(pointer, area, DBnumber, start, readLen, tmp);
if (res != 0) return null;
len -= readLen;
start += readLen;
//pbuf += readLen;
myBuffer += tmp;
}
return myBuffer;
}
public int readManyBytes(int area, int DBnumber, int start, int len, ref byte[] buffer)
{
int res, readLen;
int pos=0;
myBufferPos = 0;
while (len > 0)
{
if (len > getMaxPDULen() - 18) readLen = getMaxPDULen() - 18; else readLen = len;
byte[] tmp = new byte[readLen];
res = daveReadBytes(pointer, area, DBnumber, start+pos, readLen, tmp);
if (res != 0) return res;
tmp.CopyTo(buffer, pos);
len -= readLen;
pos += readLen;
}
return 0;
}
Habe nur mit den from Methoden noch probleme, weis nicht wie Ich die deklariere, aber die mache ich jetzt gerade selber direkt in csharp, so das ich keine c methoden brauche.
Blos ohne unions ist das alles ein bisschen kompliziert...
Die ist natürlich auch irgendwann erfolgreich getestet worden. Aber ich habe keine .NET-Bibel gelesen. Ich bin davon ausgegangen, daß das was funktioniert auch erlaubt ist und weiterhin funktionieren wird. Wenn dann aber Leute andere Ergebnisse erzielen, kann ich nicht alle Versionen von .NET ausprobieren. Daher den Rat, sich so etwas wie daveReadManyBytes selbst zu programieren. Sind ja nur 5-6 Zeilen.Ich verstehe nicht ganz warum du dir ReadManyBytes selbst programmierst. In der .NET ist die doch drin und bei mir funktioniert die prima.
Gruß Key
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?