Строка обратно в байтовый массив - не работает - PullRequest
4 голосов
/ 30 мая 2011

У меня есть поток, который преобразуется в байтовый массив.

Затем я беру этот массив и превращаю его в строку.

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

     private void Parse(Stream stream, Encoding encoding)
     {
        // Read the stream into a byte array
        byte[] allData = ToByteArray(stream);

        // Copy to a string for header parsing
        string allContent = encoding.GetString(allData);

        //This does not convert back right - just for demo purposes, not how the code is used
        allData = encoding.GetBytes(allContent);
    }

    private byte[] ToByteArray(Stream stream)
    {
        byte[] buffer = new byte[32768];
        using (MemoryStream ms = new MemoryStream())
        {
            while (true)
            {
                int read = stream.Read(buffer, 0, buffer.Length);
                if (read <= 0)
                    return ms.ToArray();
                ms.Write(buffer, 0, read);
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

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

private byte[] ToByteArray(Stream stream, System.Text.Encoding encoding)
{
    using(var sr = new StreamReader(stream, encoding))
    {
        return encoding.GetBytes(sr.ReadToEnd());
    }
}

РЕДАКТИРОВАТЬ
Поскольку вы работаете с данными изображения, вы должны использовать Convert.ToBase64String для преобразования byte[] в string. Затем вы можете использовать Convert.FromBase64String декодирование, чтобы преобразовать обратно в byte[]. Причина, по которой encoding.GetBytes не работает, заключается в том, что в byte[] могут быть некоторые данные, которые нельзя представить в виде строки для этой кодировки.

private void Parse(Stream stream, Encoding encoding)
{
    byte[] allData = ToByteArray(stream);

    string allContent = Convert.ToBase64String(allData);  

    allData = Convert.FromBase64String(allContent);
}
2 голосов
/ 30 мая 2011

Не имея дополнительной информации, я вполне уверен, что это проблема кодировки текста. Скорее всего, кодировка текста в потоке отличается от кодировки, указанной в качестве вашего параметра. Это приведет к различным значениям на уровне байтов.

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

...