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

字符串通信协议解析函数

unit HUtil32;
//提供大量的辅助函数
{$WARNINGS OFF}
interface

uses
   Classes, SysUtils, WinTypes, WinProcs, Graphics, Messages, Dialogs;

type
   Str4096 = array [0..4096] of AnsiChar;
   Str256 = array [0..256] of AnsiChar;
   //名称、值对照表
   TyNameTable = record
     Name: string;
     varl: Longint;
   end;

   TLRect = record
      Left, Top, Right, Bottom: Longint;
   end;
// 取 SearchAfter, ArrestBefore之间的字符串
function  ArrestStringEx (Source, SearchAfter, ArrestBefore: AnsiString; var ArrestStr: AnsiString): AnsiString;
// 获取指定字符串中以指定分割符结尾的子串
function  GetValidStr3 (Str: AnsiString; var Dest: AnsiString; const Divider: array of AnsiChar): AnsiString;

implementation

function ArrestStringEx (Source, SearchAfter, ArrestBefore: AnsiString; var ArrestStr: AnsiString): AnsiString;
var
   SrcLen: integer;
   GoodData: Boolean;
   i, n: integer;
begin
   ArrestStr := ''; {result string}
   if Source = '' then begin
      Result := '';
      exit;
   end;

   try
      SrcLen := Length (Source);
      GoodData := FALSE;
      if SrcLen >= 2 then
         if Source[1] = SearchAfter then begin
            Source := Copy (Source, 2, SrcLen-1);
            SrcLen := Length (Source);
            GoodData := TRUE;
         end else begin
            n := Pos (SearchAfter, Source);
            if n > 0 then begin
               Source := Copy (Source, n+1, SrcLen-(n));
               SrcLen := Length(Source);
               GoodData := TRUE;
            end;
         end;
      if GoodData then begin
         n := Pos (ArrestBefore, Source);
         if n > 0 then begin
            ArrestStr := Copy (Source, 1, n-1);
            Result := Copy (Source, n+1, SrcLen-n);
         end else begin
            Result := SearchAfter + Source;
         end;
      end else begin
         for i:=1 to SrcLen do begin
            if Source[i] = SearchAfter then begin
               Result := Copy (Source, i, SrcLen-i+1);
               break;
            end;
         end;
      end;
   except
      ArrestStr := '';
      Result := '';
   end;
end;

//获取指定字符串中以指定分割符结尾的子串
function GetValidStr3 (Str: AnsiString; var Dest: AnsiString; const Divider: array of AnsiChar): AnsiString;
const
   BUF_SIZE = 20480; //$7FFF;
var
   Buf: array[0..BUF_SIZE] of AnsiChar;
   BufCount, Count, SrcLen, I, ArrCount: Longint;
   Ch: AnsiChar;
label
 CATCH_DIV;
begin
   try
      SrcLen := Length(Str);
      BufCount := 0;
      Count := 1;

      if SrcLen >= BUF_SIZE-1 then begin
         Result := '';
         Dest := '';
         exit;
      end;

      if Str = '' then begin
         Dest := '';
         Result := Str;
         exit;
      end;
      ArrCount := sizeof(Divider) div sizeof(AnsiChar);

      while TRUE do begin
         if Count <= SrcLen then begin
            Ch := Str[Count];
            for I:=0 to ArrCount- 1 do
               if Ch = Divider[I] then
                  goto CATCH_DIV;
         end;
         if (Count > SrcLen) then begin
            CATCH_DIV:
            if (BufCount > 0) then begin
               if BufCount < BUF_SIZE-1 then begin
                  Buf[BufCount] := #0;
                  Dest := string (Buf);
                  Result := Copy (Str, Count+1, SrcLen-Count);
               end;
               break;
            end else begin
               if (Count > SrcLen) then begin
                  Dest := '';
                  Result := Copy (Str, Count+2, SrcLen-1);
                  break;
               end;
            end;
         end else begin
            if BufCount < BUF_SIZE-1 then begin
               Buf[BufCount] := Ch;
               Inc (BufCount);
            end;
         end;
         Inc (Count);
      end;
   except
      Dest := '';
      Result := '';
   end;
end;

end.

相关文章:

  • 虚拟机下host-only模式服务器之间通信
  • DATASNAP远程方法返回TSTREAM正解
  • 对比学习UIKit和AppKit--入门级
  • SVM算法入门
  • 分布函数(连续型连续型)
  • iOS应用开发攻略(助你iOS开发中攻城拔寨)
  • 在Struts2标签s:textfield中显示正确的日期
  • sql 用户定义函数自动生成自增长ID
  • 免费的精品: Productivity Power Tools 动画演示
  • C++之solmyr小品文
  • CMake的应用(在vision studio2008中去掉 ALL_BUILD 和 ZERO_CHECK)
  • 使用sqlite保存数据返回主键
  • 码云 Gitee 新增仓库访问之 IP 白名单功能
  • CentOS 6.4 下安装vsftpd
  • python基础数据类型(1)
  • 「译」Node.js Streams 基础
  • Babel配置的不完全指南
  • create-react-app做的留言板
  • IDEA常用插件整理
  • js递归,无限分级树形折叠菜单
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL的数据类型
  • Node项目之评分系统(二)- 数据库设计
  • Sass 快速入门教程
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 精彩代码 vue.js
  • 爬虫模拟登陆 SegmentFault
  • 消息队列系列二(IOT中消息队列的应用)
  • 用element的upload组件实现多图片上传和压缩
  • Hibernate主键生成策略及选择
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​queue --- 一个同步的队列类​
  • ​ubuntu下安装kvm虚拟机
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)C#调用WebService 基础
  • (转)nsfocus-绿盟科技笔试题目
  • (转)为C# Windows服务添加安装程序
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • /usr/bin/env: node: No such file or directory
  • /var/lib/dpkg/lock 锁定问题
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RequestBody与@ResponseBody的使用
  • @staticmethod和@classmethod的作用与区别
  • @SuppressWarnings(unchecked)代码的作用
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序