Что происходит с этим байтовым массивом? - PullRequest
12 голосов
/ 01 июля 2011

У меня есть байтовый массив: 00 01 00 00 00 12 81 00 00 01 00 C8 00 00 00 00 00 08 5C 9F 4F A5 09 45 D4 CE

Он читается через StreamReader с использованием UTF8 encoding

// Note I can't change this code, to many component dependent on it.
using (StreamReader streamReader = 
    new StreamReader(responseStream, Encoding.UTF8, false))
{
    string streamData = streamReader.ReadToEnd();
    if (requestData.Callback != null)
    {
        requestData.Callback(response, streamData);
    }
}

Когда эта функция запускается, мне возвращается следующее (я преобразовал в байтовый массив)

00 01 00 00 00 12 EF BF BD 00 00 01 00 EF BF BD 00 00 00 00 00 08 5C EF BF BD 4F EF BF BD 09 45 EF BF BD

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

Обратите внимание, я работаю с ограниченным API WP7.

Надеюсь, что вы, ребята, можете помочь.

Спасибо!

Обновите справку...

если я сделаю следующий код, это почти правильно, единственное, что неправильно, это разделение 5-го до последнего байта.

byte[] writeBuf1 = System.Text.Encoding.UTF8.GetBytes(data);
                    string buf1string = System.Text.Encoding.BigEndianUnicode.GetString(writeBuf1, 0, writeBuf1.Length);
                    byte[] writeBuf = System.Text.Encoding.BigEndianUnicode.GetBytes(buf1string);

1 Ответ

26 голосов
/ 01 июля 2011

Исходный массив байтов , а не , закодированный как UTF-8. Поэтому StreamReader заменяет каждый неверный байт символом замены U + FFFD. Когда этот символ кодируется обратно в UTF-8, это приводит к последовательности байтов EF BF BD. Вы не можете создать исходное значение байта из строки, потому что информация полностью потеряна.

...