2013-12-26 10 views
0

У меня есть массив байтов, и мне нужно, чтобы преобразовать этот массив в String с помощью функции Text.Encoding.UTF8.GetString(byte[] bytes), как это:Преобразовать байт в байт * [] в C#

String myStr; 

fixed (byte* pImageName = outBuffer) 
{ 
    myStr = System.Text.Encoding.UTF8.GetString(pImageName as byte[]); 
} 

Как я могу это сделать?

+3

Почему у вас есть указатель в первую очередь? Вы вообще не должны этого делать. – SLaks

+0

Я думаю, что самый большой вопрос здесь - длина 'byte []'. Вам нужно увеличить указатель, чтобы получить весь массив. –

ответ

1

Что вы ищете здесь я считаю, это призыв к ИАС вручную маршала от неуправляемого до управляемой памяти:

String myStr; 
fixed (byte* pImageName = outBuffer) 
{ 
    var convertedArray = new byte[outLength]; 

    System.Runtime.InteropServices.Marshal.Copy(new IntPtr(pImageName), convertedArray , 0, outLength); 

    myStr = System.Text.Encoding.UTF8.GetString(convertedArray); 
} 

Ключа к выше коде является вызовом маршала копии, которая двигается байты от неуправляемой до управляемой памяти. Вы захотите убедиться, что неуправляемая память доступна и имеет соответствующую длину, или вы можете получить некоторые очень неожиданные результаты.

Примечание

Как уже сказал, большую часть времени вы хотите, чтобы избежать указателей, когда это возможно. Если вы импортируете C++ или другую неуправляемую библиотеку, большую часть времени вы можете просто использовать тип «IntPtr» и разрешать .NET делать конверсии для вас. StringBuilder, как правило, также отображает указатель на символ C++ - опять же, надеюсь, вам не нужно будет использовать указатели. По сути, я понимаю, что interop-службы используют вызовы маршала внутри, поэтому при необходимости просматривайте этот интерфейс, и я думаю, вы должны найти то, что ищете.

Удачи вам!

Смежные вопросы