C # конвертировать byte [], содержащий строку в стиле c, в строку - НЕ Encoding.GetString (byte []) - PullRequest
5 голосов
/ 11 мая 2011

глупо, я пытаюсь преобразовать байтовый массив, полученный из внешнего источника, а не мой элемент управления, в строку. (И да, я знаю о Encoding.GetString(byte[]).

Что у меня так далеко:

void myfunc()
{
    byte[] rawData = new byte[ 128 ];

    for( int i = 0; i < rawData.Length; ++i )
    {
        rawData[ i ] = 0;
    }

    rawData[ 0 ] = (byte)'H';
    rawData[ 1 ] = (byte)'e';
    rawData[ 2 ] = (byte)'l';
    rawData[ 3 ] = (byte)'l';
    rawData[ 4 ] = (byte)'o';


    string asString = Encoding.UTF8.GetString( rawData, 0, rawData.Length );

    string asRealString = Encoding.UTF8.GetString( rawData );
}

Обе строки содержат часть Hello, а также множество \ 0 после этого - это не то, чего я ожидал. Выход из отладчика: asRealString =

"Hello\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"

Есть ли способ, который дал бы мне строку вроде "Hello"?

Я сделал goolge, но все, что я получил, было Encoding.GetString(byte[]) ...

РЕДАКТИРОВАТЬ : Создание байтового массива выходит за рамки моей компетенции! Я получаю это как часть большей структуры C-Style. И нет ведущей длины строки. Кроме того, я надеялся, что есть способ, созданный для этого, и мне не нужно было искать первый \ o и конвертировать техн, зная длину ....

EDIT Вот что я использовал в конце:

private static string convertCString( byte[] buffer, int maxLength, Encoding targetEncoding )
{
    int length = 0;
    int realMax = buffer.Length < maxLength ? buffer.Length : maxLength;

    for( 
         ; 0 != buffer[length] && length < realMax
         ; ++length )
    {}

    return targetEncoding.GetString( buffer, 0, length );
}

Ответы [ 7 ]

13 голосов
/ 11 мая 2011

Просто найдите первое 0:

    int len = Array.IndexOf(rawData, (byte)0); // maybe some bounds check too
    string asString = Encoding.UTF8.GetString(rawData, 0, len);
2 голосов
/ 11 мая 2011

Создание байтового массива выходит за рамки моей компетенции!Я получаю это как часть большей структуры C-Style.И нет ведущей длины строки.

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

Я предполагаю, что то, что у вас сейчас есть, выглядит так:

struct CStruct
{
  [MarshalAs(UnmanagedType.ByValArray, SizeConst=128)]
  public byte[] data;
}

Попробуйте изменить его на:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct CStruct
{
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
  public string data;
}
2 голосов
/ 11 мая 2011

Попробуйте

Encoding.UTF8.GetString( rawData ).Trim();
1 голос
/ 11 мая 2011

Почему ты этого не ожидал?Вы явно сказали, чтобы это делалось для начала:

byte[] rawData = new byte[ 128 ];

for( int i = 0; i < rawData.Length; ++i )
{
    rawData[ i ] = 0;   // RIGHT HERE
}

Приведенный выше код создает массив байтов из 128 элементов, и цикл for заполняет его.Затем ваш код явно меняет значение первых 5 байтов.Если вы не хотите видеть \ 0, вам нужно либо не помещать его туда, либо исключать из массива перед отправкой на GetString.

0 голосов
/ 11 мая 2011
void myfunc()
{
    byte[] rawData = new byte[ 128 ];

    //CLR will initialize each elemnet in arry to the 0
    //for( int i = 0; i < rawData.Length; ++i )
    //{
    //    rawData[ i ] = 0;
    //}

    rawData[ 0 ] = (byte)'H';
    rawData[ 1 ] = (byte)'e';
    rawData[ 2 ] = (byte)'l';
    rawData[ 3 ] = (byte)'l';
    rawData[ 4 ] = (byte)'o';

    // you should know length of the received string (each IO read method return number of read bytes), if you don't know it you can try to search 0 as the EOS
    var receivedBytes = Array.IndexOf(rawData, 0);
    string asString = Encoding.ASCII.GetString( rawData, 0, receivedBytes );
}
0 голосов
/ 11 мая 2011
new string(Array.ConvertAll(rawData, x => (char)x))

Строковый конструктор завершит строку первым \ 0.

0 голосов
/ 11 мая 2011

Когда вы делаете

string asString = Encoding.UTF8.GetString( rawData, 0, rawData.Length );

Вместо ввода rawData.Length, вы не можете просто передать фактическую длину строки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...