📄 punfun.pas
字号:
unit PunFun;
interface
//把十六进制字符串转换为二进制字符串
function HexToBin(HexNr : string): string;
//转换一个十六进制字符为整数
function HexCharToInt(HexToken : char):Integer;
//把十六进制字符串转换为二进制字符串
function HexCharToBin(HexToken : char): string;
//指数函数
function pow(base, power: integer): integer;
//把二进制字符串转换为整数
function BinStrToInt(BinStr : string) : integer;
//解码一个7-bit SMS(GSM 03.38)为ASCII码
function DecodeSMS7Bit(PDU : string):string;
//返转一个字符串
function ReverseStr(SourceStr : string) : string;
//把字符串中前后两个字符调换位置
function ChangePlaceS(SourceStr: string) : string;
//转换一个十六进制字符串为整数
function HexStrToInt(SourceStr: string) : Integer;
//求出一个宽字符的ASCII码值
function WideCharToASC(SourceWideChar: WideChar): Integer;
//此函数是用来求出字符串SubStr在字符串S从StartPos以后的位置
function Postion(Substr,S: string; StartPos: Integer): Integer;
//此函数是用来判断字符串是否为十六进制字符串
function IfHex(S: string): Boolean;
//此函数是用来判断字符串SubStr在字符串S中出现的次数
function CountStr(SubStr,S: string): integer;
//此函数是用来把从GSM模块中读到的短信内容翻译出来
function SMSDecode(SourCode: string; var HandNum,SmsInfo,SendTime: string): Smallint;
//此函数是用来把电话号码和短消息内容转换成相应的16进制代码
function SMChangHex(HandNum: string; SendInfo: string):string;
implementation
uses sysutils, strutils;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来把电话号码和短消息内容转换成相应的16进制代码
//函数名:SMChangHex
//参 数:1、HandNum: 手机号码
// 2、SendInfo: 短信内容
//返回值:string 转换后的16进制字符串
//作 者:卞伟 2003年1月
/////////////////////////////////////////////////////////////
function SMChangHex(HandNum: string; SendInfo: string):string;
var
I: integer;
Temp: string;
strUcode: UCS4String;
begin
Result:= '';
//---------------------------------------------------------
//转换手机号码
//---------------------------------------------------------
if LeftBStr(HandNum,3) = '+86' then
HandNum:= RightBStr(HandNum,Length(HandNum) -1) + 'F'
else if LeftBStr(HandNum,2) = '86' then
HandNum:= HandNum + 'F'
else
HandNum:= '86' + HandNum + 'F';
Temp:= '';
for I:= 1 to Length(HandNum) div 2 do
begin
Temp:= Temp + MidBStr(HandNum,I * 2,1) + MidBStr(HandNum,I * 2 - 1,1);
end;
HandNum:= Temp;
//----------------------------------------------------------
//转换短信息内容为unicode编码
//----------------------------------------------------------
strUcode:= WideStringToUCS4String(SendInfo);
Temp:= '';
for I:= 1 to Length(WideString(SendInfo)) do
begin
Temp:= Temp + IntToHex(strUcode[I - 1],4);
end;
SendInfo:= Temp;
//放头标记和字符总长数及编码类型
//Temp:= '0021010D91' + HandNum + '0008' + IntToHex(Length(SendInfo) div 2,2) + SendInfo;
Result:= '0021010D91' + HandNum + '0008' + IntToHex(Length(SendInfo) div 2,2) + SendInfo;
// Result:= Temp;
// Result:= 'AT+CMGS=' + IntToStr(Length(Temp) div 2 - 1) + Chr(13);// + Temp + Chr(26);
end;
//////////////////////////////////////////////////////////////////
//描 述:此函数是用来把从GSM模块中读到的短信内容翻译出来
//函数名:SMSDecode
//参 数:1、SourCode 源字符串
// 2、PCenterNum 解码后的短信中心号码
// 3、HandNum 发送方手机号码
// 4、SmsInfo 接收到的短信内容
// 5、SendTime 发送时间
//返 回:Smallint
// 0: 成功
// -1:失败
//作 者:卞伟 2002.12
////////////////////////////////////////////////////////////////
function SMSDecode(SourCode: string; var HandNum,SmsInfo,SendTime: string): Smallint;
var
TempS: string;
TempI: Integer;
CentreNum: string; //短信中心号码
TP_DCS: string; //数据编码方式
I: Integer;
begin
result:= 0;
SourCode:= TrimRight(SourCode); //删除结尾部分的控制字符及空格字符
SourCode:= TrimLeft(SourCode); //删除开头部分的控制字符及空格字符
TempI:= Pos(#13 + #10,SourCode);
TempS:= LeftStr(SourCode,TempI - 1); //取得引导部分
SourCode:= RightStr(SourCode,Length(SourCode) - TempI -1); //取得剩余的部分
TempS:= TrimRight(TempS); //删除结尾部分的控制字符及空格字符
SourCode:= TrimLeft(SourCode); //删除开头部分的控制字符及空格字符
if (Length(TempS) > 9) and (Pos('"REC ',TempS) > 0) then //标示是在发送模式为1(即TEXT)时收到的信息
begin
Delete(TempS,1,Pos('","',TempS) + 2);
HandNum:= MidBStr(TempS,2,Pos('",',TempS) - 2);
Delete(TempS,1,Pos('",,"',TempS) + 3);
SendTime:= LeftStr(TempS,Pos('"',TempS) -1);
SendTime:= '20' + LeftStr(TempS,2) + '-' + MidBStr(TempS,4,2) + '-' + MidBStr(TempS,7,2) + ' ' + MidBStr(TempS,10,8);
Delete(Temps,1,Pos(#13 + #10,TempS) + 1);
TempI:= Pos(#13 + #10,SourCode);
if TempI > 0 then
SmsInfo:= LeftStr(SourCode,TempI -1)
else
SmsInfo:= SourCode;
if (IfHex(SmsInfo)) and (Length(SmsInfo) mod 4 = 0) then
//为十六进制编码
begin
//标示二个字节代表一个字符号
TempS:= '';
for I:= 1 to Length(SmsInfo) div 4 do
begin
SourCode:= MidBStr(SmsInfo, I * 4 -3,4);
TempS:= TempS + widechar(HexStrToInt(SourCode));
end;
SmsInfo:= TempS;
end;
end
else //标示是在发送模式为0(即PDU)时收到的信息
begin
//求出短信中心号码
TempI:= HexStrToInt(MidBStr(SourCode,1,2)) * 2;
CentreNum:= MidBStr(SourCode,5,TempI - 2);
CentreNum:= LeftStr(ChangePlaceS(CentreNum),Length(CentreNum) -1);
//求出不包括短信中心号码的字符串
SourCode:= RightStr(SourCode,Length(SourCode) - 2 - TempI);
//删除掉SMS_DELIVER的第一个8位
SourCode:= RightStr(SourCode,LengtH(SourCode) - 2);
//--------------------------------
//求出发送方手机号码
//---------------------------------
//求出手机号码的长度
TempI:= HexStrToInt(MidBStr(SourCode,1,2));
if (TempI mod 2) > 0 then
begin
//标志手机号码长度为奇数
TempI:= TempI + 1;
//求出手机号码
TempS:= MidBStr(SourCode,5,TempI);
//转换位置
TempS:= ChangePlaceS(TempS);
//去掉后面的“F”
HandNum:= LeftStr(TempS,TempI -1);
end
else
begin
//求出手机号码
TempS:= MidBStr(SourCode,5,TempI);
//转换位置
TempS:= ChangePlaceS(TempS);
end;
//求出剩余的内容
SourCode:= RightStr(SourCode,Length(SourCode) - TempI - 4);
//求出数据的编码方式
TP_DCS:= MidBStr(SourCode, 3, 2);
//求出不包括数据编码方式的内容
SourCode:= RightStr(SourCode,Length(SourCode) - 4);
//求出日期及时间。格式为:2002-10-21 11:30:40.140
TempS:= ChangePlaceS(LeftStr(SourCode,12));
SendTime:= '20' + LeftStr(TempS,2); //年
SendTime:= SendTime + '-' + MidBStr(TempS,3,2); //月
SendTime:= SendTime + '-' + MidBStr(TempS,5,2); //日
SendTime:= SendTime + ' ' + MidBStr(TempS,7,2); //时
SendTime:= SendTime + ':' + MidBStr(TempS,9,2); //分
SendTime:= SendTime + ':' + MidBStr(TempS,11,2); //秒
//求出接收到的字符串的长度
TempI:= HexStrToInt(MidBStr(SourCode,15,2)) * 2;
//求出不包括日期时间及长度的字符串
SourCode:= RightStr(SourCode,Length(Sourcode) - 16);
//求出短信内容
SmsInfo:= LeftStr(SourCode,TempI);
//解释短信内容
if TP_DCS = '00' then
begin
//7Bit代表一个字符
SmsInfo:= DecodeSMS7Bit(SmsInfo);
end
else if TP_DCS = '08' then
begin
//标示二个字节代表一个字符号
TempS:= '';
for I:= 1 to Length(SmsInfo) div 4 do
begin
SourCode:= MidBStr(SmsInfo, I * 4 -3,4);
TempS:= TempS + widechar(HexStrToInt(SourCode));
end;
SmsInfo:= TempS;
end;
end;
end;
//////////////////////////////////////////////////////////////////
//目 的:此函数是用来判断字符串SubStr在字符串S中出现的次数
//函数名: CountStr
//参 数:1、SubStr
// 2、S
//返 回:Integer
//作 者:卞伟 2002.12
//////////////////////////////////////////////////////////////////
function CountStr(SubStr,S: string): integer;
var
Count: integer;
Temp: Integer;
begin
Count:= 1;
Result:= 0;
while True do
begin
Temp:= Postion(SubStr,S,Count);
if Temp > 0 then
begin
Count:= Count + Length(SubStr) + Temp;
Result:= Result + 1;
end
else
Exit;
end;
end;
//////////////////////////////////////////////////////////////////
//目 的:此函数是用来判断字符串是否为十六进制字符串
//函数名: IfHex
//参 数:S :源字符串
//返 回:Boolean
// True: 是
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -