首页 > 其他分享 >CS144-lab0

CS144-lab0

时间:2023-10-09 22:34:19浏览次数:39  
标签:uint64 string buffer CS144 len queue lab0 data

Checkpoint 0 Writeup

该lab要实现一个字节流,兼具写入和读出的能力,并且buffer空间受限。
根据要实现的函数和读写功能,内部要存储的成员为

  • std::queue<std::string> buffer_ {}; 用于存储写入的字符串(原本用的std::queue,但由于queue内存不连续,调用peek返回string_view时还要将char组合为string或者每次只返回一个字符,导致空间和时间效率低,所以选择了直接存储string,更高效的版本还可以存储一个std::queue<std::string_view>)
  • uint64_t capacity_ buffer容量
  • uint64_t bytes_pushed_ 写入的字节数
  • uint64_t bytes_popped_ 读出的字节数
  • bool is_closed_ 是否关闭
  • bool has_error_ 是否有错误
  • uint64_t cur 当前读取的位置,指向buffer队首字符串

主要函数实现

  • void Writer::push( string data )
    将字符串写入buffer,buffer中不允许有空字符串,所以如果data为空或者无可用空间,直接返回;否则将data子串(大小有data长度和可用空间确定)入队

  • string_view Reader::peek() const
    返回buffer中的剩余字符串,如果buffer非空,至少返回长度为1的string_view

  • void Reader::pop( uint64_t len )
    删除buffer中累计长度为len的字符串,配合cur移动

  • 其余函数主要是返回ByteStream状态和数据,利用成员变量即可获得

class ByteStream
{
protected:
  uint64_t capacity_;
  // Please add any additional state to the ByteStream here, and not to the Writer and Reader interfaces.
  /*
  simple version cause queue stores char, and the memory of queue is uncontinuous,
  so we can't use pointer to get the address of the next element, in peek we can only get one char each time
  https://zhuanlan.zhihu.com/p/622628007
  std::queue<char> buffer_{};
  uint64_t bytes_pushed_ = 0;
  uint64_t bytes_popped_ = 0;
  bool is_closed_ = false;
  bool has_error_ = false;
  */
  // good enough
  std::queue<std::string> buffer_ {};
  uint64_t bytes_pushed_ = 0;
  uint64_t bytes_popped_ = 0;
  bool is_closed_ = false;
  bool has_error_ = false;
  uint64_t cur = 0;
  /*
  better https://zhuanlan.zhihu.com/p/630739394
  using string_view.remove_prefix and queue<string_view> to quikly pop data
  */
public:
  explicit ByteStream( uint64_t capacity );

  // Helper functions (provided) to access the ByteStream's Reader and Writer interfaces
  Reader& reader();
  const Reader& reader() const;
  Writer& writer();
  const Writer& writer() const;
};
void Writer::push( string data )
{
  // Your code here.
  uint64_t len = data.size();
  len = min( len, available_capacity() );
  // do not just test data, or you will push "", which is hard to correct
  if ( len == 0 )
    return;
  buffer_.push( data.substr( 0, len ) );
  bytes_pushed_ += len;
}
void Reader::pop( uint64_t len )
{
  // Your code here.
  len = min( len, bytes_buffered() );
  uint64_t poped = 0;
  while ( poped < len ) {
    uint64_t sz = buffer_.front().size();
    if ( sz - cur <= len - poped ) {
      poped += sz - cur;
      buffer_.pop();
      cur = 0;
    } else {
      cur += len - poped;
      poped = len;
    }
  }
  bytes_popped_ += poped;
}

标签:uint64,string,buffer,CS144,len,queue,lab0,data
From: https://www.cnblogs.com/wangerblog/p/17753351.html

相关文章

  • CS144-lab4
    Checkpoint4Writeup报文头格式IPV4头/**+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*|Version|IHL|TypeofService|TotalLength|*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*|......
  • 2023夏季《移动软件开发》实验报告:lab01
    一、实验目标学习使用快速启动模板创建小程序的方法;学习不使用模板手动创建小程序的方法。二、实验步骤自动生成小程序首先到微信公众平台官网首页注册账号,进行信息填写登记,使用邮箱激活账号。然后到微信开发者工具官网,根据自己的电脑版本下载微信开发者工具,并进行安......
  • 【学习笔记-CS144 计算机网络】传输层
    概述主要任务:对接端口连接管理分割和重组上下数据差错和纠错功能流量控制传输层协议TCP特点:可靠性高端到端,面向连接基于字节速度慢向下传递操作步骤:接受来自应用层的8位字节的数据流,并根据MTU分段。封装上队头标记,打包成数据包将......
  • CS144 计算机网络 Lab4:TCP Connection
    前言经过前面几个实验的铺垫,终于到了将他们组合起来的时候了。Lab4将实现TCPConnection功能,内部含有TCPReceiver和TCPSender,可以与TCP连接的另一个端点进行数据交换。实验要求简单来说,这次实验就是要在TCPConnection类中实现下图所示的有限状态机:这些状态对应T......
  • CS61B_lab02
    题目描述:dcatenate(IntListA,IntListB):返回一个由A的所有元素组成的列表,后面是B的所有元素。可能会修改A。Don'tuse'new'。publicstaticIntListdcatenate(IntListA,IntListB){if(A==null){returnB;}IntListptr=......
  • CS144 计算机网络 Lab3:TCP Sender
    前言在Lab2中我们实现了TCPReceiver,负责在收到报文段之后将数据写入重组器中,并回复给发送方确认应答号。在Lab3中,我们将实现TCP连接的另一个端点——发送方,负责读取ByteStream(由发送方上层应用程序创建并写入数据),并将字节流转换为报文段发送给接收方。代码实现TCPSe......
  • CS144 计算机网络 Lab2:TCP Receiver
    前言Lab1中我们使用双端队列实现了字节流重组器,可以将无序到达的数据重组为有序的字节流。Lab2将在此基础上实现TCPReceiver,在收到报文段之后将数据写入重组器中,并回复发送方。实验要求TCP接收方除了将收到的数据写入重组器中外,还需要告诉发送发送方:下一个需要的但是还......
  • Lab06-04
    目录样本分析与前三个样本类似,增加了循环样本分析......
  • Lab06-03
    目录样本信息字符串信息导入表信息样本分析查杀思路样本信息与Lab06-01、Lab06-02类似,多出一个函数字符串信息导入表信息样本分析样本没有太多操作检查网络连接状态如果存在网络,访问http://www.practicalmalwareanalysis.com获取第5个字符根据返回的第5个字符做不......
  • Lab06-02
    目录与Lab06-01类似与Lab06-01类似......