当前位置: 首页 > news >正文

网站建设推广服务合同范本什么是电子商务专业?

网站建设推广服务合同范本,什么是电子商务专业?,网站开发全程实例课本代码,泉州网站建设技术支持数据压缩是一种常见的操作#xff0c;可以有效地减小数据的体积#xff0c;节省存储空间和网络带宽。在本文中#xff0c;我们将深入讨论数据压缩的流程#xff0c;并详细解释 zlib 库中相关函数的使用#xff0c;包括 deflateInit2()、deflate()、deflateEnd() 等。我们将…数据压缩是一种常见的操作可以有效地减小数据的体积节省存储空间和网络带宽。在本文中我们将深入讨论数据压缩的流程并详细解释 zlib 库中相关函数的使用包括 deflateInit2()、deflate()、deflateEnd() 等。我们将通过一个具体的例子来展示如何使用这些函数来实现数据的压缩操作。 先来讲讲这三个最重要的函数吧。 函数作用 deflateInit2() 函数的主要作用是初始化压缩器并设置相关的参数。在调用这个函数之后我们就可以使用返回的 z_stream 结构体来执行压缩操作。通过设置不同的参数我们可以定制压缩器的行为以满足不同的压缩需求。 deflate() 函数的主要作用是执行压缩操作。在调用这个函数之前我们需要将待压缩的数据和输出缓冲区的信息设置到 z_stream 结构体中然后调用 deflate() 函数来执行压缩操作。压缩器将会尽可能多地将输入数据压缩到输出缓冲区中并返回压缩操作的状态。根据返回值我们可以判断压缩操作是否成功并进行相应的错误处理或者下一步操作。 deflateEnd() 函数的主要作用是结束压缩器的工作并释放相关资源。在调用这个函数之前我们需要确保所有的压缩操作已经完成不再需要压缩器的工作了。调用这个函数后压缩器将释放所占用的内存空间并结束其工作状态不再接受新的压缩任务。 通常情况下我们在完成所有的压缩操作后应该调用 deflateEnd() 函数来释放压缩器所占用的资源以确保程序的内存使用情况正常并避免出现内存泄漏等问题。 函数接口讲解 1.deflateInit2() int deflateInit2(z_stream *strm, int level, int method, int windowBits, int memLevel, int strategy);参数说明 strm指向一个 z_stream 结构的指针该结构包含了要初始化的压缩器的相关信息。level压缩级别取值范围为 0 到 9表示压缩程度从不压缩到最大压缩。常用的值包括 Z_DEFAULT_COMPRESSION 默认压缩级别和 Z_NO_COMPRESSION 不压缩。method压缩方法通常为 Z_DEFLATED表示使用 DEFLATE 压缩算法。windowBits窗口大小通常取值为 -15 到 -8其中 -15 表示使用默认窗口大小最大压缩而其他值可以用于指定自定义的窗口大小。memLevel内存级别用于控制内存的使用取值范围为 1 到 9。strategy压缩策略包括 Z_DEFAULT_STRATEGY默认策略、Z_FILTERED滤波器策略和 Z_HUFFMAN_ONLY仅霍夫曼编码等。 strategy压缩策略如何选择 Z_DEFAULT_STRATEGY默认策略 这是默认的压缩策略它在大多数情况下表现良好。它使用 zlib 库内部的启发式算法来选择最佳的压缩方法。在大多数情况下Z_DEFAULT_STRATEGY 提供了良好的压缩比和速度。 Z_FILTERED滤波器策略 滤波器策略主要适用于数据流中包含重复模式的情况例如图像数据或者音频数据。这个策略使用了更复杂的滤波器算法以便更好地识别和利用数据中的重复模式。滤波器策略通常可以获得更好的压缩比但可能会导致压缩速度变慢。 Z_HUFFMAN_ONLY仅霍夫曼编码 这个策略强制使用霍夫曼编码来压缩数据而不使用其他压缩算法。霍夫曼编码通常在文本数据或者其他具有高度可预测性的数据上表现良好但在一般情况下可能不如其他算法那样有效。Z_HUFFMAN_ONLY 策略通常会牺牲一些压缩比以换取更快的压缩速度。 综合来说选择合适的压缩策略取决于应用场景和数据特点。对于大多数通用数据Z_DEFAULT_STRATEGY 是一个良好的选择。如果数据中存在明显的重复模式可以考虑使用 Z_FILTERED 策略来获得更好的压缩效果。而 Z_HUFFMAN_ONLY 策略则适用于特定类型的数据例如文本数据。 2.int deflate(); int deflate(z_stream *strm, int flush);参数说明 strm指向一个 z_stream 结构体的指针包含了压缩器的相关信息包括输入数据和输出缓冲区等。flush操作标志用于指定执行压缩操作的方式。可选的值有 Z_NO_FLUSH普通压缩操作压缩器将尽可能多地将输入数据压缩到输出缓冲区中但不保证输出缓冲区被填满。Z_SYNC_FLUSH同步刷新操作压缩器将立即将尽可能多的输入数据压缩到输出缓冲区中并且保证输出缓冲区被填满。Z_FULL_FLUSH完全刷新操作类似于 Z_SYNC_FLUSH但同时清空压缩器的内部状态使得压缩后的数据可以独立解压缩。Z_FINISH结束操作表示输入数据已经全部传递给压缩器压缩器在压缩完成后返回。 返回值 deflate() 函数返回一个整数值表示压缩操作的状态。可能的返回值有 Z_OK表示压缩操作成功。Z_STREAM_END表示输入数据已经被完全压缩并且压缩器处于结束状态。Z_BUF_ERROR表示输出缓冲区不足需要更大的缓冲区才能继续执行压缩操作。Z_STREAM_ERROR表示压缩器内部状态错误通常是由于参数设置不正确或者其他原因造成的。 3.deflateEnd() int deflateEnd(z_stream *strm);参数说明 strm指向一个 z_stream 结构体的指针用于传递压缩器的相关信息。 返回值 deflateEnd() 函数返回一个整数值表示结束压缩器工作的状态。可能的返回值有 Z_OK表示压缩器工作结束成功相关资源已被释放。Z_STREAM_ERROR表示压缩器内部状态错误通常是由于参数设置不正确或者其他原因造成的。 数据压缩流程概述 数据压缩的流程一般包括以下几个步骤 设置压缩器参数初始化压缩器并设置相关的参数包括压缩级别、压缩方法、窗口大小等。传递待压缩数据将待压缩的数据传递给压缩器。执行压缩执行压缩操作并将压缩后的数据写入输出缓冲区。写入压缩后的数据将压缩后的数据写入到输出文件或输出流中。结束压缩释放压缩器所占用的资源并结束压缩操作。 在下面的示例中我们将详细讨论每个步骤并演示如何使用 zlib 库中的函数来实现这些操作。 2. 流程详解 2.1. 设置压缩器参数 在使用 zlib 库进行数据压缩之前我们需要初始化一个压缩流 z_stream并设置相关的参数。下面是设置压缩器参数的代码示例 z_stream zs; zs.zalloc Z_NULL; zs.zfree Z_NULL; zs.opaque Z_NULL; if (deflateInit2(zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_FILTERED) ! Z_OK) {std::cout Failed to initialize zlib deflate! std::endl;// 处理初始化失败的情况 }在这段代码中我们初始化了一个 z_stream 结构体并将其相关参数设置为 Z_NULL。然后我们使用 deflateInit2() 函数初始化压缩器并设置了压缩级别、压缩方法、窗口大小等参数。如果初始化失败函数将返回 Z_OK我们需要进行错误处理。 1. zs.zalloc zs.zalloc 是一个指向内存分配函数的指针。当 zlib 需要分配内存来存储压缩或解压缩所需的数据结构时它会调用这个指针指向的函数来分配内存。通常情况下我们可以将这个指针设置为 Z_NULL表示使用默认的内存分配函数即 malloc() 函数。如果需要使用自定义的内存分配函数我们可以将这个指针设置为指向我们自定义的分配函数。 2. zs.zfree zs.zfree 是一个指向内存释放函数的指针。当 zlib 需要释放之前分配的内存时它会调用这个指针指向的函数来释放内存。通常情况下我们可以将这个指针设置为 Z_NULL表示使用默认的内存释放函数即 free() 函数。如果需要使用自定义的内存释放函数我们可以将这个指针设置为指向我们自定义的释放函数。 3. zs.opaque zs.opaque 是一个指向透明对象的指针用于传递额外的参数给内存分配和释放函数。当 zlib 调用内存分配和释放函数时它会将 zs.opaque 指针指向的对象传递给这些函数以便我们可以在函数中访问和使用这些额外的参数。通常情况下我们可以将这个指针设置为 Z_NULL表示不需要传递额外的参数。如果需要传递额外的参数给内存分配和释放函数我们可以将这个指针设置为指向我们所需的对象。 2.2. 传递待压缩数据 接下来我们需要将待压缩的数据传递给压缩器。这里我们将使用 zs.next_in 指针来指向待压缩的数据并使用 zs.avail_in 来指定待压缩数据的大小。下面是传递待压缩数据的代码示例 zs.next_in (Bytef *)body.c_str(); zs.avail_in body.size();在这段代码中我们将待压缩的数据的指针和大小设置到 z_stream 结构体中以便压缩器可以对其进行压缩操作。 具体讲解 zs.next_in (Bytef *)body.c_str(); zs.next_in 是指向将要被压缩的数据的指针。body.c_str() 返回一个指向字符串 body 存储的字符数组的指针类型为 const char *。(Bytef *) 这部分是类型转换将 const char * 转换为 Bytef * 类型Bytef 类型是 zlib 库定义的无符号字节类型用于表示字节数据。这样zs.next_in 就指向了 body 字符串的首地址即要被压缩的数据的起始位置。 zs.avail_in body.size(); zs.avail_in 表示待压缩的数据的字节大小。body.size() 返回字符串 body 中字符的数量即待压缩的数据的大小。这样zs.avail_in 就设置为了待压缩数据的字节大小。 这两行代码的作用是将待压缩的数据的指针和大小设置到压缩流结构体 z_stream 中以便后续的压缩操作可以正确地处理这些数据。 2.3. 执行压缩 一旦设置了压缩器的参数和输入数据我们就可以执行压缩操作了。我们使用 deflate() 函数来执行压缩操作并将压缩后的数据写入输出缓冲区。下面是执行压缩操作的代码示例 char outbuffer[32768]; //这两行代码用于设置 zlib 压缩流 z_stream 的输出参数 zs.next_out reinterpret_castBytef *(outbuffer); zs.avail_out sizeof(outbuffer);if (deflate(zs, Z_FINISH) Z_STREAM_ERROR) {std::cout Failed to deflate data! std::endl;// 处理压缩失败的情况 }在这段代码中我们准备了一个输出缓冲区 outbuffer并将其地址设置到 zs.next_out 指针中。然后我们指定输出缓冲区的大小到 zs.avail_out 中并使用 deflate() 函数执行压缩操作。如果压缩操作失败函数将返回 Z_STREAM_ERROR我们需要进行错误处理。 具体讲解 zs.next_out reinterpret_castBytef *(outbuffer); zs.next_out 是指向用于存储压缩后数据的缓冲区的指针。reinterpret_castBytef *(outbuffer) 将 outbuffer 缓冲区的地址转换为 Bytef * 类型Bytef 类型是 zlib 库定义的无符号字节类型用于表示字节数据。这样zs.next_out 就指向了用于存储压缩后数据的缓冲区的起始位置。 zs.avail_out sizeof(outbuffer); zs.avail_out 表示输出缓冲区的大小即缓冲区可用于存储的字节数。sizeof(outbuffer) 返回 outbuffer 缓冲区的大小即缓冲区的总容量。这样zs.avail_out 就设置为了输出缓冲区的大小。 这两行代码的作用是将用于存储压缩后数据的缓冲区的指针和大小设置到压缩流结构体 z_stream 中以便 deflate() 函数可以将压缩后的数据写入到这个缓冲区中。 2.4. 写入压缩后的数据 压缩操作完成后我们将压缩后的数据写入到输出文件或输出流中。在这个示例中我们将压缩后的数据写入到输出文件中。下面是写入压缩后的数据的代码示例 ofs.write(outbuffer, sizeof(outbuffer) - zs.avail_out);在这段代码中我们使用 write() 函数将压缩后的数据写入到输出文件中。我们从输出缓冲区中写入数据的大小是 sizeof(outbuffer) - zs.avail_out即实际压缩后数据的大小。 2.5. 结束压缩 最后我们需要结束压缩器的工作并释放相关资源。我们使用 deflateEnd() 函数来结束压缩器的工作释放压缩器所占用的内存空间。下面是结束压缩器工作的代码示例 deflateEnd(zs);在这段代码中我们调用 deflateEnd() 函数结束压缩器的工作并传入 z_stream 结构体的指针作为参数。这样压缩器就会释放所占用的资源并结束压缩操作。 具体讲解 deflateEnd() 函数用于结束压缩器的工作并释放相关资源。这个函数会清理 z_stream 结构体和与之关联的内存空间以及释放压缩所需的其他资源。具体来说deflateEnd() 函数会完成以下操作 清理和释放与给定的 z_stream 结构体相关联的压缩状态。释放任何由压缩器分配的内存例如压缩器使用的内部缓冲区。结束压缩器的工作并释放相关资源使得压缩器可以被重新初始化或销毁。 在使用 deflate() 函数完成所有压缩操作后应该调用 deflateEnd() 函数来释放压缩器所占用的资源。这样可以确保程序在完成压缩任务后正确释放内存并避免内存泄漏等问题。 实现一个压缩函数的完整API实例 bool SetCompressedContent(const std::string body){std::ofstream ofs;ofs.open(_name .gz, std::ios::binary); // 以二进制写入模式打开压缩文件if (!ofs.is_open()){std::cout Failed to open compressed file! std::endl;return false;}z_stream zs;zs.zalloc Z_NULL;zs.zfree Z_NULL;zs.opaque Z_NULL;if (deflateInit2(zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_FILTERED) ! Z_OK){std::cout Failed to initialize zlib deflate! std::endl;ofs.close();return false;}zs.next_in (Bytef *)body.c_str();zs.avail_in body.size();char outbuffer[32768];do{zs.next_out reinterpret_castBytef *(outbuffer);zs.avail_out sizeof(outbuffer);if (deflate(zs, Z_FINISH) Z_STREAM_ERROR){std::cout Failed to deflate data! std::endl;deflateEnd(zs);ofs.close();return false;}ofs.write(outbuffer, sizeof(outbuffer) - zs.avail_out);} while (zs.avail_out 0);deflateEnd(zs);ofs.close();return true;}
http://www.pierceye.com/news/997998/

相关文章:

  • 青岛网站建设公司电话棋牌室的网站怎么做
  • 网站更改公司需要重新备案吗传媒网站
  • 海诚网站建设青岛李村网站设计公司
  • 哪个网站可以宣传做的蛋糕网站商城微信支付接口申请
  • 如何做淘客推广网站可信赖的手机网站设计
  • 西城专业网站建设公司哪家好外贸网站优化谷歌关键词排名
  • 先做网站后备案仿做网站可以整站下载器吧
  • ASP.NET实用网站开发 课后答案开发网站过程
  • 做网站需要编码吗仿站网站源码
  • 响应式网站什么意思爱南宁app下载官网最新
  • 自己做的网站怎么添加采集模块网站管理包括哪些内容
  • php做网站验证码的设计电商网站的二级怎么做
  • 广西网站建设价钱微信crm管理系统
  • 福州网站建设公司中小企业荆门市城乡建设管理局网站
  • 建设信用卡网站首页有做车身拉花的网站吗
  • 怎么做婚恋网站织梦网站推广插件
  • rtt全民互助平台网站开发自己怎样做免费网站
  • 建站模板东营建网站公司
  • 如何用vs做网站网络推广方案下拉管家微xiala11
  • 可以做彩票广告的网站吗做网站的应用
  • 龙岗网站 建设深圳信科湘潭做网站价格品牌磐石网络
  • 湖北网站排名优化安卓项目开发
  • 网站怎么引入微信支付郑州官方通报
  • 在南宁做家教兼职的网站北京通州做网站
  • 深圳网站的建设维护公司秦皇岛市建设局官网
  • 做网站 插件静态网站开发课程相关新闻
  • 网站建站 公司无锡搜索引擎营销的内容
  • 公司网站建设小知识单页网站是什么样子的
  • 大学网站建设排名深圳网站建设公司报价
  • 贵阳网站制作公司茶叶推广方案