Ich habe diese beiden Methoden erstellt, um native utf-8 Zeichenfolgen (char *) in eine verwaltete Zeichenfolge umzuwandeln und umgekehrt. Der folgende Code macht den Job:Konvertierung in .net: Native Utf-8 <-> Verwaltete Zeichenfolge
public IntPtr NativeUtf8FromString(string managedString)
{
byte[] buffer = Encoding.UTF8.GetBytes(managedString); // not null terminated
Array.Resize(ref buffer, buffer.Length + 1);
buffer[buffer.Length - 1] = 0; // terminating 0
IntPtr nativeUtf8 = Marshal.AllocHGlobal(buffer.Length);
Marshal.Copy(buffer, 0, nativeUtf8, buffer.Length);
return nativeUtf8;
}
string StringFromNativeUtf8(IntPtr nativeUtf8)
{
int size = 0;
byte[] buffer = {};
do
{
++size;
Array.Resize(ref buffer, size);
Marshal.Copy(nativeUtf8, buffer, 0, size);
} while (buffer[size - 1] != 0); // till 0 termination found
if (1 == size)
{
return ""; // empty string
}
Array.Resize(ref buffer, size - 1); // remove terminating 0
return Encoding.UTF8.GetString(buffer);
}
Während NativeUtf8FromString ok ist, StringFromNativeUtf8 ein Chaos ist aber der einzige sichere Code, den ich laufen konnte. Mit unsicherem Code könnte ich ein Byte * verwenden, aber ich möchte keinen unsicheren Code. Gibt es eine andere Möglichkeit, an die jemand denken kann, wo ich die Zeichenfolge für jedes enthaltene Byte nicht kopieren muss, um die 0-Beendigung zu finden.
ich fügen Sie einfach den Code unsave hier:
public unsafe string StringFromNativeUtf8(IntPtr nativeUtf8)
{
byte* bytes = (byte*)nativeUtf8.ToPointer();
int size = 0;
while (bytes[size] != 0)
{
++size;
}
byte[] buffer = new byte[size];
Marshal.Copy((IntPtr)nativeUtf8, buffer, 0, size);
return Encoding.UTF8.GetString(buffer);
}
Wie Sie es nicht hässlich sehen nur unsicher braucht.
Warum kümmern Sie sich nicht um 'unsicheren' Code? – CodesInChaos
@CodelnChaos: Nicht sicher. Weil Procect den/unsafe-Schalter aktivieren muss, der sich für mich schmutzig anfühlt. – Totonga
Der '/ unsafe' Schalter ist ziemlich bedeutungslos. 'Marshal. *' Ist genauso unsicher wie ein Zeigercode, auch wenn der Schalter nicht benötigt wird. – CodesInChaos