📄 pkgunit.pas
字号:
unit PkgUnit;
(*
通讯包模块
01:包头
02:数据段分隔符
03:包尾
限制通讯包长度为2048
数据段格式:
数据名+':'+数据
例如:#01+
'LCNO:LC9987401000001'+
#02+
'AMAT:128.45'+
#02+
'CYNO:USD'+
#02+
#03
数据包初始化: InitPackage
数据打包: AddPackage
数据解包: GetPackage
*)
interface
uses
Windows, Messages, Graphics, Controls, Forms, Dialogs,
SysUtils, Classes;
const
ChmyOK = 0;
ChmyErr_spExec = 1;
CRLF = #13#10;
ACC_OK = 'ok';
SPackageHead = #01;
SPackageEnd = #03;
SPackageData = #02;
SPackageLength = 2048;
Type
TSPkgData = array [1..SPackageLength] of char;
TSPackage = class(TObject)
private
{ Private declarations }
function GetItem( Hash : string ) : string;
procedure SetItem( Hash : string; data:string );
public
{ Public declarations }
buf:TSPkgData;
constructor Create(dd:TSPkgData);overload;virtual;
constructor Create;overload;virtual;
property Item[Hash : string] : string read GetItem write SetItem;
procedure GetPacket(var v:TSPkgData);
end;
implementation
constructor TSPackage.Create(dd:TSPkgData);
begin
Inherited Create;
move(dd,buf,SPackageLength);
end;
constructor TSPackage.Create;
begin
buf[1]:=SPackageHead;
buf[2]:=SPackageEnd;
end;
function TSPackage.GetItem( Hash : string ) : string;
var i,j:integer;str:string;bb:boolean;
begin
str:='';
i:=1;
j:=1;
bb := False;
while(TRUE) do
begin
if(i>=SPackageLength)or(buf[i]=SPackageEnd)then break;
if buf[i] = Hash[j] then Inc(j)
else j:=1;
inc(i);
if(j>length(Hash))and(buf[i]=':')then
begin
bb := True;
break;
end;
end;
if(bb)then
begin
while(True) do
begin
inc(i);
if(buf[i]=SPackageData)or(buf[i]=SPackageData)or(i>=SPackageLength)then
break
else
str := str + buf[i];
end;
end;
result := str;
end;
procedure TSPackage.SetItem( Hash:string; data:string );
var i:integer;str:string;
begin
i:=1;
str := Hash + ':' + data + SPackageData + SPackageEnd;
while(True)do
begin
if buf[i]=SPackageEnd then break;
inc(i);
if i>= SPackageLength then exit;
end;
if(i+Length(str)+2)>=SPackageLength then exit;
move(str[1],buf[i],length(str));
end;
procedure TSPackage.GetPacket(var v:TSPkgData);
begin
move(buf,v,SPackageLength);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -