Может ли кто-нибудь помочь мне с простым алгоритмом? - PullRequest
0 голосов
/ 07 апреля 2010

Я хочу проанализировать все байты, загруженные запросом http , если они> 100 КБ, если нет, объединить их в буфер, а когда буфер получит> 100 КБ, снова проанализировать их и обнулить uffer. Но не для разбора всех данных файла, а в конечном итоге получить ex: 2kb. Он должен проверить следующий блок и, если он окончательный, конкатировать его (например: final_chunk.Length + 2kb)

Дело в том, что мне нужно каждый раз анализировать по крайней мере 100 килобайт кусков, не меньше.

Ответы [ 3 ]

1 голос
/ 07 апреля 2010

Как сказал PoweRoy, у вас уже есть алгоритм, вам просто нужно его кодировать ... Позвольте мне описать его шаг за шагом.

  1. Объявить объект локального буфера
  2. Сделать асинхронный / синхронный HTTPзапрос (я предпочитаю Async Call)
  3. Сохранить его в буфере
  4. Проверить размер буфера (если он> 100 КБ)
  5. Если размер буфера не> 100 КБ Добавить данные в буфер
  6. , если он> 100 КБ, считывает буфер и очищает его.
  7. Перейти к шагу 2
0 голосов
/ 07 апреля 2010

А вот и список байтовых массивов:

class SmartChunk {
        private int ChunkSize;
        private int DataSize;
        private int pos;
        private int len;
        private List<byte[]> buff;

        public SmartChunk(int InitChunkSize, int DataLen) {
            buff = new List<byte[]>();
            pos = 0;
            len = DataLen;
            ChunkSize = InitChunkSize;
        }

        public List<byte[]> Append(byte[] b) {
            if (pos + ChunkSize * 2 > len) ChunkSize = len - pos;

            if (b.Length >= ChunkSize) {
                List<byte[]> priv = new List<byte[]>();
                priv.Add(b);
                return priv;
            }
            else {
                buff.Add(b);
                int total_size = 0;
                foreach(byte[] inner in buff){
                    total_size += inner.Length; 
                }

                if (total_size >= ChunkSize) {
                    pos += total_size;

                    List<byte[]> temp = new List<byte[]>(buff);
                    //foreach (byte[] tmp in buff) temp.Add(tmp);
                    buff.Clear();
                    return temp;
                }
            }

            return null;
        }
    }
0 голосов
/ 07 апреля 2010

Полагаю, это поможет. Я просто должен переписать его с байтовыми массивами. Вы находите какие-либо ошибки?

        class SmartChunk {

        private int ChunkSize;
        private int DataSize;
        private int pos;
        private int len;
        private string buff = "";

        public SmartChunk(int InitChunkSize, int DataLen) {
            pos = 0;
            len = DataLen;
            ChunkSize = InitChunkSize;
        }

        public string Append(string s) {
            if (pos + ChunkSize * 2 > len) ChunkSize = len - pos;

            if (s.Length >= ChunkSize) {
                return s;
            }
            else {
                buff += s;
                if (buff.Length >= ChunkSize) {
                    pos += buff.Length;
                    string b = buff;
                    buff = "";
                    return b;
                }
            }

            return null;
        }
    }
...