2010-04-07 60 views
0

我想解析所有由http请求下载的字节如果它们大于100kb,如果它们不是,将它们连接到一个缓冲区并且当缓冲区获得大于100kb时再次解析它们,并且空过滤器。但不要解析所有的文件数据,并在最后的块获取前:2kb。它必须检查下一个块,如果它是最后的concat它(例如:final_chunk.Length + 2kb)有人可以用简单的算法帮我吗?

重点是,我需要每次至少解析100kb块,没有什么。

+4

我觉得你的算法(后本身)现在你需要我在等待404响应为代码 – RvdK 2010-04-07 14:29:12

+1

小于100kb。 – 2010-04-07 14:37:24

回答

1

由于PoweRoy说你已经得到算法,你只需要它的代码...让我一步一步来。

  1. 声明本地缓冲区对象
  2. 使异步/同步HTTP请求(我更喜欢异步调用)
  3. 将其保存到缓冲区
  4. 检查缓冲区大小(如果它是> 100KB)
  5. 如果缓冲区大小不大于100kb将数据追加到缓冲区
  6. 如果> 100kb读取缓冲区并清除它。
  7. 转到第2步
0

我想这会做的伎俩。我只需要用字节数组重写它。你有没有发现错误?

 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; 
     } 
    } 
0

这里,它是使用字节数组列表:

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; 
     } 
    } 
相关问题