Преобразование в .net: Native Utf-8 <-> Managed String

Я создал эти два метода для преобразования строк Native utf-8 (char*) в управляемую строку и наоборот. Следующий код выполняет эту работу:

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);
}

В то время как NativeUtf8FromString в порядке, StringFromNativeUtf8 представляет собой беспорядок, но это единственный безопасный код, который я смог запустить. Используя небезопасный код, я мог бы использовать байт*, но мне не нужен небезопасный код. Есть ли другой способ, которым кто-то может придумать, где мне не нужно копировать строку для каждого содержащегося байта, чтобы найти завершение 0.


Я просто добавляю сюда код для несохранения:

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);
}

Как видите, это не безобразно, просто нужно быть небезопасным.

10
задан Totonga 27 May 2012 в 12:19
поделиться