Чтение “разделенного на блоки” ответа с HttpWebResponse

Я также хочу использовать этот синтаксис для большей проверки типов.

Но я также согласен с тем, что синтаксис и ментальная модель использования указателей проще и легче запомнить.

Вот еще некоторые препятствия, с которыми я столкнулся.

  • Доступ к массиву требует использования (*p)[]:
    void foo(char (*p)[10])
    {
        char c = (*p)[3];
        (*p)[0] = 1;
    }
    
    Вместо этого возникает соблазн использовать локальный указатель на символ:
    void foo(char (*p)[10])
    {
        char *cp = (char *)p;
        char c = cp[3];
        cp[0] = 1;
    }
    
    Но это частично превзойдет цель использования правильного типа.
  • Нельзя забывать использовать адрес-оператор при назначении адреса массива указателю на массив:
    char a[10];
    char (*p)[10] = &a;
    
    Адрес- оператора получает адрес всего массива в &a, с правильным типом, чтобы назначить его p. Без оператора a автоматически преобразуется в адрес первого элемента массива, как и в &a[0], который имеет другой тип. Поскольку это автоматическое преобразование уже происходит, я всегда озадачен тем, что & необходим. Это согласуется с использованием & для переменных других типов, но я должен помнить, что массив является особым и мне нужен &, чтобы получить правильный тип адреса, хотя значение адреса одинаково , Одной из причин моей проблемы может быть то, что я узнал K & amp; R C еще в 80-х годах, что еще не позволило использовать оператор & на всех массивах (хотя некоторые компиляторы игнорировали это или допускали синтаксис). Это, кстати, может быть еще одной причиной, по которой переходы с привязками трудно принять: они работают только с ANSI C, а ограничение оператора & может быть еще одной причиной считать их слишком неудобными.
  • Когда typedef является not , используемым для создания типа для указателя на массив (в общем заголовочном файле), тогда глобальный указатель на массив должен более сложная декларация extern для обмена ею между файлами:
    fileA:
    char (*p)[10];
    
    fileB:
    extern char (*p)[10];
    
12
задан casperOne 24 May 2012 в 17:27
поделиться

3 ответа

Не попробовали его это "разделенным на блоки" ответом, но что-то вроде этого работало бы?

StringBuilder sb = new StringBuilder();
Byte[] buf = new byte[8192];
Stream resStream = response.GetResponseStream();
string tmpString = null;
int count = 0;
do
{
     count = resStream.Read(buf, 0, buf.Length);
     if(count != 0)
     {
          tmpString = Encoding.ASCII.GetString(buf, 0, count);
          sb.Append(tmpString);
     }
}while (count > 0);
4
ответ дан 2 December 2019 в 23:51
поделиться

Craig, не видя поток, который Вы читаете, немного трудно отладить, но ВОЗМОЖНО Вы могли изменить настройки переменной количества к этому:

count = resStream.Read(buf, 0, buf.Length-1);

Это - определенный взлом, но если последнее чтение уничтожит Вас, и это не возвращает данных затем теоретически, то это избежит проблемы. Я все еще задаюсь вопросом, почему поток делает это.

-1
ответ дан 2 December 2019 в 23:51
поделиться

У меня была та же проблема (который является, как я закончил здесь :-). В конечном счете разысканный он к тому, что разделенный на блоки поток не был допустим - заключительный нулевой блок длины, отсутствовал. Я придумал следующий код, который обрабатывает и допустимые и недопустимые разделенные на блоки потоки.

using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
    StringBuilder sb = new StringBuilder();

    try
    {
        while (!sr.EndOfStream)
        {
            sb.Append((char)sr.Read());
        }
    }
    catch (System.IO.IOException)
    { }

    string content = sb.ToString();
}
-1
ответ дан 2 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: