Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение текста из бинарного файла 
V
    Опции темы
V0fka
Дата 30.8.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

Пишу данные в бинарный файл:

Код

        byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }

            FileInfo f = new FileInfo(@"test.dat");
            using (FileStream fs = f.Open(FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
            {
                using (BinaryWriter bw = new BinaryWriter(fs))
                {
                    byte[] bytes = GetBytes("Какой-то текст. And english.");
                    bw.Write(bytes);
                }
            }


Хочу прочитать:

 
Код

       private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            FileInfo f = new FileInfo(@"test.dat");
            using (FileStream fs = f.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (BinaryReader br = new BinaryReader(fs))
                {
                    int bytesRead = 0;
                    byte[] buffer = new byte[255];
                    StringBuilder result = new StringBuilder();
                    while ((bytesRead = br.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        for (int i = 0; i <= bytesRead - 1; i++)
                        {
                            result.AppendFormat("{0:x2} ", buffer[i]);
                        }
                        char[] ch = System.Text.Encoding.UTF8.GetString(buffer).ToCharArray(); // вот тут я ожидаю что-то получить
                        Array.Clear(buffer, 0, buffer.Length);
                    }
                    MessageBox.Show(result.ToString());
                }
            }
        }


В помеченной мною строке я ожидаю получить какие-то буковки. Но вместо этого получаю такое:

user posted image

Причем не русские, не английские буквы не отображаются. Подскажите, пожалуйста, как сделать, чтобы текст нормально прочитался?
PM MAIL   Вверх
Fobos
Дата 1.9.2013, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Я не совсем понял пример. Есть тут какие-то "темные места".
В любом случае, вот эта строка:
Код

result.AppendFormat("{0:x2} ", buffer[i]);

Это просто epic fail. Вы пытаетесь unicode символы читать побайтно и побайтно склеивать в StringBuilder - это бред.

Второе
Код

char[] ch = System.Text.Encoding.UTF8.GetString(buffer).ToCharArray(); // вот тут я ожидаю что-то получить
 
unicode опять пытается как UTF8. Надо хотя бы на
Код

char[] ch = System.Text.Encoding.Unicode.GetString(buffer).ToCharArray(); // вот тут я ожидаю что-то получить
 

сменить.
PM MAIL ICQ   Вверх
V0fka
Дата 2.9.2013, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(Fobos @  1.9.2013,  10:55 Найти цитируемый пост)
Это просто epic fail. Вы пытаетесь unicode символы читать побайтно и побайтно склеивать в StringBuilder - это бред.

А как надо? smile Пробовал так:
Код

System.Text.Encoding.Unicode.GetString(new byte[]{buffer[i]})

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

Цитата(Fobos @  1.9.2013,  10:55 Найти цитируемый пост)
Второе
unicode опять пытается как UTF8. Надо хотя бы на

Вот с этим получилось, спасибо! smile

Это сообщение отредактировал(а) V0fka - 2.9.2013, 16:28
PM MAIL   Вверх
Fobos
Дата 3.9.2013, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



А что Вам надо?
Код

System.Text.Encoding.Unicode.GetString(buffer)

Вы таким образом и так получили строку, что еще нужно?
PM MAIL ICQ   Вверх
V0fka
Дата 3.9.2013, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(Fobos @  3.9.2013,  09:13 Найти цитируемый пост)
А что Вам надо?

Это я просто пример для себя придумал, чтоб разобраться. Сейчас хочу получить конкретный символ из бинарника именно в процессе побайтного чтения.
PM MAIL   Вверх
Fobos
Дата 3.9.2013, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Можно так:
Код

StringBuilder result = new StringBuilder();

                    while ((bytesRead = br.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        for (int i = 0; i < bytesRead; i++)
                        {
                            var c = BitConverter.ToChar(buffer, i*2);
                            result.Append(c);
                        }

                        Array.Clear(buffer, 0, buffer.Length);
                    }
                    Console.WriteLine(result.ToString());

Но тут надо понимать что делаешь(я сам тут не до конца понимаю все тонкости).
Надо понимать разницу между кодировками, учитывать граничные случаи.
PM MAIL ICQ   Вверх
V0fka
Дата 3.9.2013, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Fobos, спасибо большое! smile 

Можно я обнаглею и задам ещё один вопрос, относящийся к этой теме? smile Почему при чтении символы в прочитанном файле идут через один, т.е. программа правильно считывает их так BitConverter.ToChar(buffer, i * 2), а не так BitConverter.ToChar(buffer, i)?
PM MAIL   Вверх
Fobos
Дата 3.9.2013, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Не-не, символы не идут через один. Unicode символ занимает 2 байта. А Bitconverter берет индекс первого юникод байта, Т.е. он считывает по два  байта начиная с опредлеенного индекса чтобы получить один юникод символ. ПОнятно?
PM MAIL ICQ   Вверх
V0fka
Дата 4.9.2013, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Fobos, понял smile . Ещё раз спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.