olevariant序列
olevariant序列
/// <author>cxg 2020-12-31</author> unit yn.variant; interface uses classes, zlib, Variants, SysUtils; {$IFNDEF UNICODE} type RawByteString = AnsiString; {$ENDIF} {$if CompilerVersion < 18} //before delphi 2007 type TBytes = array of Byte; {$ifend} function bytes2var(const S: TBytes): OleVariant; function var2bytes(const V: OleVariant): TBytes; function raw2bytes(const raw: RawByteString): TBytes; function bytes2raw(const bs: TBytes): RawByteString; procedure var2stream(const V: OLEVariant; Stream: TStream); procedure stream2var(Stream: TStream; var V: OLEVariant); function zip(V: OleVariant): OleVariant; function unzip(V: OleVariant): OleVariant; function var2raw(const AData: OleVariant): rawbytestring; function raw2var(const AText: rawbytestring): OleVariant; implementation function bytes2var(const S: TBytes): OleVariant; var P: Pointer; begin Result := NULL; if Length(S) > 0 then begin Result := VarArrayCreate([0, Length(S) - 1], varByte); P := VarArrayLock(Result); try Move(S[0], P^, Length(S)); finally VarArrayUnlock(Result); end; end; end; function var2bytes(const V: OleVariant): TBytes; var P: Pointer; Size: Integer; begin if VarIsArray(V) and (VarType(V) and varTypeMask = varByte) then begin Size := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1; if Size > 0 then begin SetLength(Result, Size); P := VarArrayLock(V); try Move(P^, Result[0], Size); finally VarArrayUnlock(V); end; end; end; end; function raw2bytes(const raw: RawByteString): TBytes; var len: integer; begin len := length(raw); SetLength(result, len); Move(raw[1], Result[0], len); end; function bytes2raw(const bs: TBytes): RawByteString; var len: integer; begin len := Length(bs); SetLength(Result, len); Move(bs[0], Result[1], len); end; procedure var2stream(const V: OLEVariant; Stream: TStream); var P: Pointer; begin Stream.Position := 0; Stream.Size := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1; P := VarArrayLock(V); try Stream.Write(P^, Stream.Size); finally VarArrayUnlock(V); end; Stream.Position := 0; end; procedure stream2var(Stream: TStream; var V: OLEVariant); var P: Pointer; begin V := VarArrayCreate([0, Stream.Size - 1], varByte); P := VarArrayLock(V); try Stream.Position := 0; Stream.Read(P^, Stream.Size); finally VarArrayUnlock(V); end; end; function zip(V: OleVariant): OleVariant; var M, M0: TMemoryStream; begin M := TMemoryStream.Create; M0 := TMemoryStream.Create; try if V = Null then exit; var2stream(V, M); M.Position := 0; ZCompressStream(M, M0); Stream2Var(M0, V); finally M.Free; M0.Free end; Result := V; end; function unzip(V: OleVariant): OleVariant; var M, M0: TMemoryStream; begin M := TMemoryStream.Create; M0 := TMemoryStream.Create; try if V = Null then exit; Var2Stream(V, M); M.Position := 0; ZDeCompressStream(M, M0); Stream2Var(M0, V); finally M.Free; M0.Free end; Result := V; end; function var2raw(const AData: OleVariant): rawbytestring; var nSize: Integer; pData: Pointer; begin if AData = Null then Result := '' else begin nSize := VarArrayHighBound(AData, 1) - VarArrayLowBound(AData, 1) + 1; SetLength(Result, nSize); pData := VarArrayLock(AData); try Move(pData^, Pansichar(Result)^, nSize); finally VarArrayUnlock(AData); end; end; end; function raw2var(const AText: rawbytestring): OleVariant; var nSize: Integer; pData: Pointer; begin nSize := Length(AText); if nSize = 0 then Result := Null else begin Result := VarArrayCreate([0, nSize - 1], varByte); pData := VarArrayLock(Result); try Move(Pansichar(AText)^, pData^, nSize); finally VarArrayUnlock(Result); end; end; end; end.
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/17488758.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-06-18 引入OAS3和Swagger全面提升开发者体验
2017-06-18 咏南CS开发框架新的界面风格