Frage

Ich habe folgendes Verfahren festgelegt:

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 bestanden, geschrieben in C (UnmanagedMethod). Auf der Grundlage der Dokumentation I für diese Methode haben, ist die buffer Setup richtig; Jedoch schafft Marshal.Copy ein Array der Größe recordInformation.Length statt. Wenn ich den Strahl auf die Variable outputRecord zugeordnet ist, ist der Inhalt der Zeichenfolge die Länge des buffer; Jedoch gibt es eine Anzahl von NUL (Char 0), um den Rest der Zeichenkette zu füllen, bis sie das recordInformation.Length Feld treffen. Wenn ich die letzten Parameter in der UnmanagedMethod Parameterliste buffer ändern, schaltet sich die Ausgabezeichenfolge in nichts anderes als NUL-Zeichen.

Mache ich das Marshalling falsch oder gibt es einen Weg, nachdem die Zeichenfolge von dem Byte-Array erstellt worden, um die NUL-Zeichen zu entfernen?

Danke

War es hilfreich?

Lösung

Ich habe nichts falsch mit Ihrem Beispiel sehen.

Sie werden wahrscheinlich wollen, dass die .NET-Strings beachten, kann NUL / NULL Zeichen- enthalten aber wirklich, Zeichen, die nur den Wert 0 ( '\ 0' oder '\ x00').

Sie können die Zeichen schrubben durch eine ersetzen tun oder über die Schnur zu Fuß und halten alles vor dem ersten NUL. Höchstwahrscheinlich werden Sie die letztere wollen, da dies für die Null-terminierten Strings in C typisch ist.

Hier ist ein kurzes Beispiel (Konsole), das, was in jedem Fall passiert illustriert wird.

string sTest1 = "abc\0\0def";

string sTest2 = sTest1.Replace("\0", "");
Console.WriteLine(sTest2);

int iLocation = sTest1.IndexOf('\0');
string sTest3 = "";
if (iLocation >= 0)
{
    sTest3 = sTest1.Substring(0, iLocation);
}
else
{
    sTest3 = sTest1;
}
Console.WriteLine(sTest3);

Console.ReadLine();

Der ehemalige in führt abcdef , und diese führt in abc .

Beachten Sie auch, dass diese Methode erfordert, dass Sie zuerst für NUL-Zeichen zu überprüfen, falls die Zeichenfolge, die die gesamte Pufferstelle enthält und es gab keine NUL-Zeichen überhaupt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top