博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MORMOT的数据序列
阅读量:5094 次
发布时间:2019-06-13

本文共 3319 字,大约阅读时间需要 11 分钟。

MORMOT的数据序列

mormot服务器回复客户端通过Ctxt.OutContent属性。

此属性的类型是:SockString。   // property OutContent: SockString read fOutContent write fOutContent ;

继续跟代码,发现SockString是RawByteString类型。

type{$ifdef UNICODE}  /// define the fastest Unicode string type of the compiler  SynUnicode = UnicodeString;  /// define a raw 8-bit storage string type, used for data buffer management  SockString = type RawByteString;{$else}  /// define the fastest 16-bit Unicode string type of the compiler  SynUnicode = WideString;  {$ifdef HASCODEPAGE} // FPC may expect a CP, e.g. to compare two string constants  SockString = type RawByteString;  {$else}  /// define a 8-bit raw storage string type, used for data buffer management  SockString = type AnsiString;  {$endif}{$endif}

 继续跟代码,发现RawByteString是AnsiString类型。从下面的代码可以看出,

RawByteString是跨平台的,针对不同的平台有不同的编译开关。这也是为什么要封装一个RawByteString类型。
{
$IFDEF NEXTGEN} UTF8String = type _AnsiString(65001); RawByteString = type _AnsiString($ffff); {
$NODEFINE UTF8String} {
$NODEFINE RawByteString}{
$ELSEIF Defined(LINUX64) or Defined(OSX64)} UTF8String = type AnsiString(65001); RawByteString = type AnsiString($ffff); {
$NODEFINE UTF8String} {
$NODEFINE RawByteString}{
$ELSE} UTF8String = type AnsiString(65001); RawByteString = type AnsiString($ffff);{
$ENDIF}

mormot在SynCommons.pas单元定义了一些RawByteString和其它数据类型相互转换的公共函数,一起来看看。

stream和RawByteString相互转换函数:

function StreamToRawByteString(aStream: TStream): RawByteString;var current, size: Int64;begin  result := '';  if aStream=nil then    exit;  current := aStream.Position;  if (current=0) and aStream.InheritsFrom(TRawByteStringStream) then begin    result := TRawByteStringStream(aStream).DataString; // fast COW    exit;  end;  size := aStream.Size-current;  if (size=0) or (size>maxInt) then    exit;  SetLength(result,size);  aStream.Read(pointer(result)^,size);  aStream.Position := current;end;

  

function RawByteStringToStream(const aString: RawByteString): TStream;begin  result := TRawByteStringStream.Create(aString);end;

  bytes和RawByteString相互转换函数:

procedure BytesToRawByteString(const bytes: TBytes; out buf: RawByteString);begin  SetString(buf,PAnsiChar(pointer(bytes)),Length(bytes));end;

  

procedure RawByteStringToBytes(const buf: RawByteString; out bytes: TBytes);var L: Integer;begin  L := Length(buf);  if L<>0 then begin    SetLength(bytes,L);    MoveFast(pointer(buf)^,pointer(bytes)^,L);  end;end;

  RawByteString和Variant相互转换函数:

procedure RawByteStringToVariant(const Data: RawByteString; var Value: variant);begin  with TVarData(Value) do begin    {$ifndef FPC}if VType and VTYPE_STATIC<>0 then{$endif}      VarClear(Value);    if Data='' then      VType := varNull else begin      VType := varString;      VAny := nil; // avoid GPF below when assigning a string variable to VAny      RawByteString(VAny) := Data;    end;  end;end;

  

procedure VariantToRawByteString(const Value: variant; var Dest: RawByteString);begin  case TVarData(Value).VType of  varEmpty, varNull:    Dest := '';  varString:    Dest := RawByteString(TVarData(Value).VAny);  else // not from RawByteStringToVariant() -> conversion to string    Dest := {$ifdef UNICODE}RawByteString{$else}string{$endif}(Value);  end;end;

  stream,ansistring,variant基本上代表了常用的数据格式。

转载于:https://www.cnblogs.com/hnxxcxg/p/10135110.html

你可能感兴趣的文章
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
【2.2】创建博客文章模型
查看>>
【3.1】Cookiecutter安装和使用
查看>>
【2.3】初始Django Shell
查看>>
Kotlin动态图
查看>>
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>
Jsp抓取页面内容
查看>>
大三上学期软件工程作业之点餐系统(网页版)的一些心得
查看>>
可选参数的函数还可以这样设计!
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
android中自定义下拉框(转)
查看>>
Android设计模式源码解析之外观模式(Facade)
查看>>
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>