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

数据流的压缩、编码及传递困扰

问题:

在使用流据流对ClientDataSet.XMLData内容进行压缩、编码后无法正常取得原文内容。

解决之道:

数据流存入内容之前必须确定编码格式,至于想用何种编码并不重要,但必须明确的设置,否则在进行压缩、编码之后,还原原文时会有问题,按道理用默认编码是一样的,可是若没有明确设置流的存储编码就是有问题,这个问题困扰了我整整两个星期,啥办法都尝试过直到写出这个才算解决了。

但至于用默认编码为何不行,现在还未弄明白,希望有网友能解惑。

1、对字符串进行压缩、编码、传输的例子:

procedure TTestMain.Button1Click(Sender: TObject);
var
  s1,s2:String;
  d1,d2:string;
  SourceStream1,SourceStream2,SourceStream3:TStringStream;
  DestStream1,DestStream2,DestStream3:TStringStream;
begin
  PageControl1.ActivePageIndex := 0;
  Memo2.Clear;
  s1 := Memo1.Text;
  {**************************************************************************
  TStream.Create之后,其position的值自动设置为0,其他操作必须人工干预position,
  否则position的取值为上一次操作之后的位置。
  关键点:数据流存入内容之前必须确定编码格式,至于想用何种编码并不重要,但必须
  明确的设置,否则在进行压缩、编码之后,还原原文时会有问题,按道理用默认编码是
  一样的,可是若没有明确设置流的存储编码就是有问题,这个问题困扰了我整整两个星
  期,啥办法都尝试过直到写出这个才算解决了。
  但至于用默认编码为何不行,现在还未弄明白,希望有网友能解惑。
  ***************************************************************************}
  //把s1字符串中的内容以UTF8的编码格式存入SourceStream1中。
  SourceStream1 := TStringStream.Create(s1,TEncoding.UTF8);//原始内容流
  SourceStream2 := TStringStream.Create('',TEncoding.ASCII);//用来存储压缩流
  SourceStream3 := TStringStream.Create('',TEncoding.UTF8);//用来存储Encode流,以便远程传递
  try
    System.ZLib.ZCompressStream(SourceStream1,SourceStream2);//压缩内容

    SourceStream2.Position := 0;
    Soap.EncdDecd.EncodeStream(SourceStream2,SourceStream3);//进行编码以便远程传递

    SourceStream3.Position := 0;
    s2 := SourceStream3.DataString;//取出编码后的内容,显示在Memo1中
    Memo1.Lines.Add('-------------以下为压缩并编码之后的内容:---------------');
    Memo1.Lines.Add(s2);
    ShowDataSize(Edit1,SourceStream1,SourceStream2,SourceStream3);
  finally
    SourceStream1.Free;
    SourceStream2.Free;
    SourceStream3.Free;
  end;

  {.................................................................
  .....s2的内容为Encode之后字符串,经过网络传递之后,传至客户端.....
  ..................................................................}

  d2 := s2; //取得从远程传递过来的经过了Encode编码之后的文本串
  Memo2.Text := d2;
  DestStream3 := TStringStream.Create(d2,TEncoding.UTF8);//读取远程经过了Encode编码之后的文本串
  DestStream2 := TStringStream.Create('',TEncoding.UTF8);//用来存储Decode之后的内容
  DestStream1 := TStringStream.Create('',TEncoding.UTF8);//用来存储解压缩流之后的原文内容
  try
    DestStream3.Position := 0;
    Soap.EncdDecd.DecodeStream(DestStream3,DestStream2);

    DestStream2.Position := 0;
    System.ZLib.ZDecompressStream(DestStream2,DestStream1);

    DestStream1.Position := 0;
    d1 := DestStream1.DataString;
    Memo2.Lines.Add('-------------以下为还原编码并解压后的内容:---------------');
    Memo2.Lines.Add(d1);
    ShowDataSize(Edit2,DestStream1,DestStream2,DestStream3);
  finally
    DestStream1.Free;
    DestStream2.Free;
    DestStream3.Free;
  end;
end;
1、对ClientDataSet记录集进行压缩、编码、传输的例子:

procedure TTestMain.Button2Click(Sender: TObject);
var
  s1,d1: String;
  sStream,sZipStream,sCodeStream,
  dStream,dZipStream,dCodeStream: TStringStream;
begin
  PageControl1.ActivePageIndex := 1;
  if not ClientDataSet1.Active then
    ClientDataSet1.Active := True;
  {**************************************************************************
  TStream.Create之后,其position的值自动设置为0,其他操作必须人工干预position,
  否则position的取值为上一次操作之后的位置。
  关键点:数据流存入内容之前必须确定编码格式,至于想用何种编码并不重要,但必须
  明确的设置,否则在进行压缩、编码之后,还原原文时会有问题。
  ***************************************************************************}

  sStream := TStringStream.Create('',TEncoding.UTF8);
  sZipStream := TStringStream.Create('',TEncoding.ASCII);
  sCodeStream := TStringStream.Create('',TEncoding.ASCII);
  try
    ClientDataSet1.SaveToStream(sStream,dfXMLUTF8); //读取原始记录内容

    sStream.Position := 0;
    ZCompressStream(sStream,sZipStream);//压缩原文内容

    sZipStream.Position := 0;
    EncodeStream(sZipStream,sCodeStream);//编码以便网络传递

    //把sCodeStream流的文本内容取出为字符串类型,方便进行网络传输
    sCodeStream.Position := 0;
    s1 := sCodeStream.DataString;

    ShowDataSize(Edit1,sStream,sZipStream,sCodeStream);
  finally
    sStream.Free;
    sZipStream.Free;
    sCodeStream.Free;
  end;

  {...................................................................
  .....s1的内容为Encode之后的字符串,经过网络传递之后,传至客户端.....
  ....................................................................}


  d1 := s1; //接收
  dCodeStream := TStringStream.Create(d1,TEncoding.ASCII); //存入接收流中,此时流中为编码后的内容
  dZipStream := TStringStream.Create('',TEncoding.ASCII);
  dStream := TStringStream.Create('',TEncoding.UTF8);
  try
    DecodeStream(dCodeStream,dZipStream);//解码到dZipStream流中,此时dZipStream中为压缩流

    dZipStream.Position := 0;
    ZDecompressStream(dZipStream,dStream);//解压缩到dStream流中,此时dStream中为还原后的内容

    dStream.Position := 0;
    ClientDataSet2.LoadFromStream(dStream);

    ShowDataSize(Edit2,dStream,dZipStream,dCodeStream);
  finally
    dCodeStream.Free;
    dZipStream.Free;
    dStream.Free;
  end;
end;
Demo截图如下:

Demo下载:Test.rar下载

转载于:https://www.cnblogs.com/xieyunc/p/4438267.html

相关文章:

  • Linux基础命令---mkisofs
  • Linux iptables开放特定端口
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • 线段树模板
  • KVO的使用
  • 自动化测试
  • Unicode编码字符 转换成汉字
  • 简单用户管理系统(P-05)
  • typedef 与指针、多维数组
  • 32、mysql数据库增删改查
  • Android -- 保存文件
  • ORACLE EXECUTE IMMEDIATE 用法详解
  • SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法
  • 【Advanced Windows Phone Programming】在windows phone 8中解码mp3 和编码pcm
  • JavaScript创建对象(五)——动态原型模式
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 230. Kth Smallest Element in a BST
  • Debian下无root权限使用Python访问Oracle
  • Javascript 原型链
  • mysql innodb 索引使用指南
  • PHP变量
  • Python十分钟制作属于你自己的个性logo
  • Vue ES6 Jade Scss Webpack Gulp
  • Yii源码解读-服务定位器(Service Locator)
  • 工作中总结前端开发流程--vue项目
  • 经典排序算法及其 Java 实现
  • 坑!为什么View.startAnimation不起作用?
  • 马上搞懂 GeoJSON
  • 前嗅ForeSpider中数据浏览界面介绍
  • 嵌入式文件系统
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用SAX解析XML
  • 用jQuery怎么做到前后端分离
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (汇总)os模块以及shutil模块对文件的操作
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (南京观海微电子)——I3C协议介绍
  • (转)用.Net的File控件上传文件的解决方案
  • ***原理与防范
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @取消转义
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 第一章] JavaScript 简史
  • [ 数据结构 - C++]红黑树RBTree
  • [100天算法】-实现 strStr()(day 52)
  • [C# 开发技巧]实现属于自己的截图工具