Ich habe folgende Verfahren festgelegt:NUL Zeichen aus Marshal.Copy in C#
internal string GetInformation(string recordInformation)
{
int bufferSize = GetBufferSize(recordInformation);
string outputRecord;
IntPtr output = Marshal.AllocHGlobal(bufferSize);
try
{
_returnCode = UnmanagedMethod(recordInformation, output, recordInformation.Length);
byte[] outputData = new byte[bufferSize];
Marshal.Copy(output, outputData, 0, bufferSize);
outputRecord = ASCIIEncoding.ASCII.GetString(outputData, 0, bufferSize);
}
finally
{
Marshal.FreeHGlobal(output);
}
return outputRecord;
}
In diesem Verfahren wird ein vorgegebener String (recordInformation) ist auf ein Verfahren geführt, in C (UnmanagedMethod) geschrieben. Basierend auf der Dokumentation, die ich für diese Methode habe, ist die Puffergröße richtig eingerichtet. Marshal.Copy erstellt jedoch stattdessen ein Array mit der Größe von recordInformation.Length. Wenn ich den Ray der Variable outputRecord zugewiesen habe, entspricht der Inhalt der Zeichenfolge der Länge der pufferSize. Allerdings gibt es eine Anzahl von NUL (Char 0), um den Rest der Zeichenfolge zu füllen, bis es das recordInformation.Length-Feld trifft. Wenn ich den letzten Parameter in der UnmanagedMethod-Parameterliste in pufferSize ändere, wird der Ausgabe-String in nichts anderes als NUL-Zeichen umgewandelt.
Mache ich das Marshalling falsch oder gibt es eine Möglichkeit, nachdem die Zeichenfolge aus dem Bytearray erstellt wurde, um die NUL-Zeichen zu entfernen?
Danke
Welche nicht verwaltete Methode verwenden Sie? Es ist schwer zu sagen, was der beste Weg zum Marshal wäre, ohne die native Spezifikation lesen zu können. Ist es eine API-Methode oder etwas Brauchbares? –
Die nicht verwaltete Methode ist eine Methode von einer API von Drittanbietern. Die API-Dokumentation ist alles in C und die Methodensignatur (in C) ist 'int UnmanagedMethod (char * inputstring, char * outputstring, int inputlength)'. Die outputRecord-Zeichenfolge wird mit Ausnahme der NUL-Zeichen am Ende der Zeichenfolge korrekt erstellt. – JamesEggers
Ich habe die 3rd Party API angefragt und sie kennen C# nicht und können nichts anderes als ein nicht arbeitendes/nicht kompilierendes Beispiel liefern. – JamesEggers