Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/41: Рейтинг темы: голосов - 41, средняя оценка - 4.71
 Аватар для jester
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
.NET 4.x

Чтение байтов из потока

09.06.2019, 02:44. Показов 8134. Ответов 5

Студворк — интернет-сервис помощи студентам
Метод Read считывает байты до 1956(надо 40 000) символа а дальше в массиве buffer идут нули, с функцией ReadByte всё работает. Почему так? Это у меня ошибка или где то в методе Read?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
static void Main(string[] args)
        {
 
            HttpWebRequest gt = (HttpWebRequest)WebRequest.Create("https://gidonline.io/film/futurama/");
            {
                using (HttpWebResponse resp = (HttpWebResponse)gt.GetResponse())
                {
                    //Console.WriteLine(Func_ReadByte(resp.GetResponseStream())); //1
 
                    //Console.WriteLine(Func_Read(resp.GetResponseStream(), (int)resp.ContentLength)); //2
                }
            }
            Console.ReadKey();
        }
 
 
 
        public static string Func_Read(Stream str, int length)
        {
            StringBuilder s = new StringBuilder();
 
            byte[] buffer = new byte[length];
 
            str.Read(buffer, 0, length);
 
            foreach (byte b in buffer)
            {
                //if (b!=0) 
                s.Append((char)b);
            }
 
            return s.ToString();
        }
 
        public static string Func_ReadByte(Stream str)
        {
            StringBuilder s = new StringBuilder();
 
            int temp;
            while ((temp = str.ReadByte()) != -1)
            {
                s.Append((char)temp);
            }
 
            return s.ToString();
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2019, 02:44
Ответы с готовыми решениями:

SerialPort: Ожидание События или получение ответа из потока чтения флуда байтов
Имеется: OpenPort() - открывает порт и любимый Поток readport() - Поток который считывает всё, всегда и везде lan() - метод который...

Чтение порции байтов из byte[]
Уважаемые форумчане подскажите такой вопрос имеется byte заполненный байтами , условно в нем как бы хранятся строки таблицы, ...

c# SerialPort.ReadExisting Чтение байтов из последовательного порта
Доброе время суток. Подскажите пожалуйста каким образом используя SerialPort.ReadExisting прочитать данные из порта в формате байтов. На...

5
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
09.06.2019, 03:18
Лучший ответ Сообщение было отмечено jester как решение

Решение

Цитата Сообщение от jester Посмотреть сообщение
Почему так?
Потому что вы игнорируете возвращаемое методом Read значение...
Цитата Сообщение от jester Посмотреть сообщение
Это у меня ошибка или где то в методе Read?
У вас ошибка, некорректно используете метод Read...

Не проще StreamReader использовать, чем изобретать велосипед?

C#
1
2
3
4
5
            using (Stream s = resp.GetResponseStream())
            using (StreamReader sr = new StreamReader(s))
            {
                Console.WriteLine(sr.ReadToEnd());
            }
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
09.06.2019, 11:44
Лучший ответ Сообщение было отмечено jester как решение

Решение

jester, метод Read не гарантирует что прочитает все запрошенные байты. Он возвращает сколько было реально прочитано и это нужно учитывать.

Еще одна ошибка в коде это неверная работа с кодировкой. Преобразование byte в char можно делать только для однобайтовой кодировки.

Использование StreamReader, как посоветовал Someone007, исправляет оба бага в твоем коде. Используй этот подход или используй HttpClient и его метод GetStringAsync.
1
 Аватар для jester
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
09.06.2019, 13:50  [ТС]
OwenGlendower,

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Еще одна ошибка в коде это неверная работа с кодировкой. Преобразование byte в char можно делать только для однобайтовой кодировки.
Спасибо. Я даже не задумывался никогда об этом, работает и ладно))
Если файл будет закодирован двухбайтной и выше кодировкой то ReadByte будет возвращать часть символа и надо или где - то проверять кодировку а потом считывать нужное количество байт или через StreamReader где это уже реализовано?

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Использование StreamReader, как посоветовал Someone007, исправляет оба бага в твоем коде. Используй этот подход или используй HttpClient и его метод GetStringAsync.
Хотел понять почему не работает.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
метод Read не гарантирует что прочитает все запрошенные байты. Он возвращает сколько было реально прочитано и это нужно учитывать.
Выходит что read может прочитать или не прочитать и не угадаешь как от чего это зависит. Как с этим работать тогда?
Уже понял))

Спасибо.

Добавлено через 11 минут
Someone007,
Цитата Сообщение от Someone007 Посмотреть сообщение
Потому что вы игнорируете возвращаемое методом Read значение...
Цитата Сообщение от Someone007 Посмотреть сообщение
У вас ошибка, некорректно используете метод Read...
Сложно было понять в 3 часа ночи. Вроде функция должна заполнять массив байтами но нет.

Цитата Сообщение от Someone007 Посмотреть сообщение
Не проще StreamReader использовать, чем изобретать велосипед?
Думал будет так будет веселее...

Добавлено через 5 минут
Someone007, как обычно всё начинается с мысли а что если сделать по другому и ты три часа делаешь по другому.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
09.06.2019, 14:09
Лучший ответ Сообщение было отмечено jester как решение

Решение

Цитата Сообщение от jester Посмотреть сообщение
Выходит что read может прочитать или не прочитать и не угадаешь как от чего это зависит. Как с этим работать тогда?
Вот примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public static string Func_Read(Stream str, int length)
        {
            byte[] buffer = new byte[length];
 
            int read, offset = 0;
 
            do
            {
                read = str.Read(buffer, offset, length);
                offset += read;
                length -= read;
            } while (read > 0);
 
            return Encoding.UTF8.GetString(buffer);
        }
1
 Аватар для jester
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
09.06.2019, 15:08  [ТС]
Someone007, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2019, 15:08
Помогаю со студенческими работами здесь

Не выполняется чтение из открытого потока
Не понимаю, в чём у меня ошибка. в начале пишу FileStream potok = new FileStream(path, FileMode.Open, FileAccess.Read); ...

Чтение после конца потока невозможно
Здравствуйте, пишу List<Sound> sound = new List<Sound>(); using (BinaryReader streem = new...

Сканирование байтов в памяти, и получение начального адреса байтов
Привет форумчане! У меня вопрос, как просканировать память у процесса так, чтобы получить адрес начала байтов в памяти? Я попробовал...

[UWP] Запись и чтение массива байтов StorageFile
Доброго времени суток. Перерыл все просторы интернета но на нужный след не наткнулся. Нашел только реализацию этого вопроса через...

Чтение данных из аудио потока (интернет-радио)
Добрый день, коллеги, я уже 2 месяца пытаюсь найти способ прочитать данные из потоков форматов mp3 и aac, но поиски безуспешны,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru