?? phoneshare.pas
字號(hào):
unit PhoneShare;
interface
uses
SysUtils,Math;
type
TPDUFormatRec = Record
CenterLen:Array[0..1] of Char; //短信息中心地址長(zhǎng)度
CenterType:Array[0..1] of Char; //短信息中心號(hào)碼類型,91是TON/NPI
CenterNumber:Array[0..13] of Char; //所在地GSM短信息中心的號(hào)碼
FileHeader:Array[0..1] of Char; //指正常地發(fā)送短信息
SMType:Array[0..1] of Char; //信息類型
CalledLen:Array[0..1] of Char; //被叫號(hào)碼長(zhǎng)度
CalledType:Array[0..1] of Char; //被叫號(hào)碼類型
CalledNumber:Array[0..11] of Char; //被叫號(hào)碼
// PID:Array[0..1] of Char; //
// DCS:Array[0..1] of Char; //
// TimeStamp:Array[0..13] of Char; //
SMCodeType:Array[0..5] of Char; //短信息編碼類型GSM Default Alphabet,如為中文則是000010
SMLen:Array[0..1] of Char; //短信息長(zhǎng)度
end;
TPDUSendRec = Record
SMSCLength:Array[0..1] of Char;
FirstOctet:Array[0..1] of Char;
MessageReference:Array[0..1] of Char;
PhoneLength:Array[0..1] of Char;
AddressType:Array[0..1] of Char;
Phone:Array[0..11] of Char;
TPPID:Array[0..1] of Char;
TPDCS:Array[0..1] of Char;
TPValidityPeriod:Array[0..1] of Char;
TPUserDataLength:Array[0..1] of Char;
//TPUserData
end;
TPDUFirstReadRec = Record
SMSCLength:Array[0..1] of Char;
AddressType:Array[0..1] of Char;
ServiceCenterNumber:Array[0..13] of Char; //Length???
FirstOctet:Array[0..1] of Char;
SendPhoneLength:Array[0..1] of Char;
SendPhoneType:Array[0..1] of Char;
// TONNPI:Array[0..1] of Char;
//Phone
end;
TPDUSecondReadRec = Record
TPPID:Array[0..1] of Char;
TPDCS:Array[0..1] of Char;
TimeStamp:Array[0..13] of Char;
TPUserDataLength:Array[0..1] of Char;
//TPUserData
end;
function HexToInt(HexStr:String):Integer;
function ChangeOrder(OriStr:String;TotalLen:Integer):String;
function ResumeOrder(OriStr:String):String;
function EncodeEnglish(s:String):String;
function DecodeEnglish(s:String):String;
function Encode8Bits(s:String):String;
function Decode8Bits(s:String):String;
function EncodeUniCode(s:WideString):String;
function DecodeUniCode(s:String):WideString;
Function Mix2PDU(CenterNumber,CalledNumber,ShortMsg:String):String;
function MixSendPDU(Phone,ShortMsg:String;Var SendLen:String;SMType:Integer):String;
function DisposeReadPDU(PDUData:String;Var Phone,MsgContent:String):Integer;
implementation
function ChangeOrder(OriStr:String;TotalLen:Integer):String;
var
i:Integer;
TempStr:String;
begin
OriStr:=OriStr+Copy('FFFFFFFFFF',1,TotalLen-Length(OriStr));
TempStr:='';
for i:=1 to (TotalLen Div 2) do
TempStr:=TempStr+OriStr[i*2]+OriStr[i*2-1];
Result:=TempStr;
end;
function ResumeOrder(OriStr:String):String;
var
i:Integer;
TempStr:String;
begin
TempStr:='';
for i:=1 to (Length(OriStr) Div 2) do
TempStr:=TempStr+OriStr[i*2]+OriStr[i*2-1];
Result:=StringReplace(TempStr,'F','',[rfReplaceAll]);
end;
Function Mix2PDU(CenterNumber,CalledNumber,ShortMsg:String):String;
var
TempStr,MsgContent:String;
PDURec:TPDUFormatRec;
begin
PDURec.CenterLen := '08';
PDURec.CenterType := '91';
TempStr := ChangeOrder(CenterNumber,14);
Move(TempStr[1],PDURec.CenterNumber[0],14);
PDURec.FileHeader := '11';
PDURec.SMType := '00';
PDURec.CalledLen := '0B';
PDURec.CalledType := '81';
TempStr := ChangeOrder(CalledNumber,12);
Move(TempStr[1],PDURec.CalledNumber[0],12);
PDURec.SMCodeType := '0000A7';
MsgContent := EnCodeUniCode(ShortMsg);
Move(IntToHex(Length(ShortMsg),2)[1],PDURec.SMLen[0],2);
SetLength(Result,SizeOf(PDURec));
Move(PDURec,Result[1],SizeOf(PDURec));
Result:=Result+MsgContent;
end;
function EncodeUniCode(s:WideString):String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]);
//BCD轉(zhuǎn)換
//FmtStr(t,'%4.4X',[cur]);
Result:=Result+IntToHex(Cur,4)+' ';
inc(i);
end;
end;
function DecodeUniCode(s:String):WideString;
var
p:PWord;
i,len:Integer;
cur:Integer;
TempChar:WideChar;
t:String;
begin
New(p);
Result:='';
len:=Length(s) div 4;
i:=1;
for i:=0 to Len-1 do
begin
t:=Copy(s,4*i+1,4);
p^:=HexToInt(t);
Move(p^,TempChar,2);
Result:=Result+TempChar+' ';
end;
Dispose(p);
end;
function MixSendPDU(Phone,ShortMsg:String;Var SendLen:String;SMType:Integer):String;
var
PDUSendRec:TPDUSendRec;
TempStr:String;
begin
PDUSendRec.SMSCLength := '00';
PDUSendRec.FirstOctet := '11';
PDUSendRec.MessageReference := '00';
PDUSendRec.PhoneLength := '0B';
PDUSendRec.AddressType := '91';
TempStr:=ChangeOrder(Phone,12);
Move(TempStr[1],PDUSendRec.Phone[0],12);
PDUSendRec.TPPID := '00';
Case SMType of
0://Englsih
PDUSendRec.TPDCS := '00';
4://8Bits
PDUSendRec.TPDCS := '04';
else //Chinese
PDUSendRec.TPDCS := '08';
end;
PDUSendRec.TPValidityPeriod := 'AA';
Case SMType of
0://Englsih
begin
Move(IntToHex(Length(ShortMsg),2)[1],PDUSendRec.TPUserDataLength[0],2);
SetLength(Result,SizeOf(PDUSendRec));
Move(PDUSendRec,Result[1],SizeOf(PDUSendRec));
Result:=Result+EncodeEnglish(ShorTMsg);
SendLen:=IntToStr((Length(Result)-2) Div 2);
end;
4://8Bits
begin
Move(IntToHex(Length(ShortMsg),2)[1],PDUSendRec.TPUserDataLength[0],2);
SetLength(Result,SizeOf(PDUSendRec));
Move(PDUSendRec,Result[1],SizeOf(PDUSendRec));
Result:=Result+Encode8Bits(ShorTMsg);
SendLen:=IntToStr((Length(Result)-2) Div 2);
end;
else //Chinese
begin
//TempStr:=EnCodeUniCode(ShortMsg);
TempStr:= ShortMsg;
Move(IntToHex(Length(TempStr) Div 2,2)[1],PDUSendRec.TPUserDataLength[0],2);
SetLength(Result,SizeOf(PDUSendRec));
Move(PDUSendRec,Result[1],SizeOf(PDUSendRec));
Result:=Result+TempStr;
SendLen:=IntToStr((Length(Result)-2) Div 2);
end;
end;
end;
function EncodeEnglish(s:String):String;
var
i,j,len:Integer;
cur,Int1:Integer;
begin
len:=Length(s);
//j 用于移位計(jì)數(shù)
i:=1;
j:=0;
while i<=len do
begin
if i<len then
//數(shù)據(jù)變換
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
Result:=Result+IntToHex(cur,2);
inc(i);
//移位計(jì)數(shù)達(dá)到7位的特別處理
j:=(j+1) mod 7;
if j=0 then inc(i);
end;
end;
function DecodeEnglish(s:String):String;
var
i,j,len:Integer;
TempIntArray:Array of Integer;
TempStr:String;
cur,Int1:Integer;
begin
len:=Length(s) div 2;
SetLength(TempIntArray,Len);
for i:=0 to Len-1 do
begin
TempStr:=Copy(s,i*2+1,2);
TempIntArray[i]:=HexToInt(TempStr);
end;
//j 用于移位計(jì)數(shù)
i:=0;
j:=0;
while i<=len-1 do
begin
if i<>0 then
//數(shù)據(jù)變換
cur:=((TempIntArray[i] shl j) and $7f) or (TempIntArray[i-1] shr (8-j))
else
cur:=(TempIntArray[i] shl j) and $7f;
Result:=Result+Chr(cur);
//移位計(jì)數(shù)達(dá)到7位的特別處理
j:=(j+1) mod 7;
if j=0 then
begin
cur:=TempIntArray[i] shr 1;
Result:=Result+Chr(cur);
end;
inc(i);
end;
end;
function DisposeReadPDU(PDUData:String;Var Phone,MsgContent:String):Integer;
var
TempInt,Len:Integer;
FirstReadRec:TPDUFirstReadRec;
SecondReadRec:TPDUSecondReadRec;
TempStr:String;
begin
//First Read Record
Move(PDUData[1],FirstReadRec,SizeOf(FirstReadRec));
TempInt:=HexToInt(FirstReadRec.SendPhoneLength);
if (TempInt mod 2 = 1) then
Inc(TempInt);
//Phone
Phone:=Copy(PDUData,SizeOf(FirstReadRec)+1,TempInt);
Phone:=ResumeOrder(Phone);
//Second Read Record
Move(PDUData[SizeOf(FirstReadRec)+TempInt+1],SecondReadRec,SizeOf(SecondReadRec));
//Message Length
Len:=HexToInt(SecondReadRec.TPUserDataLength)*2;
//Short Message Content
TempStr:=Copy(PDUData,SizeOf(FirstReadRec)+TempInt+SizeOf(SecondReadRec)+1,Len);
Case HexToInt(SecondReadRec.TPDCS) of
0..3://7 Bits
begin
MsgContent:=DecodeEnglish(TempStr);
end;
4..7://8 Bits
begin
MsgContent:=Decode8Bits(TempStr);
end;
8..11://UniCode
begin
MsgContent:=DecodeUniCode(TempStr);
end;
else
begin
Result:=1; //type Error
Exit;
end;
end;
end;
function HexToInt(HexStr:String):Integer;
var
i,TempInt,LocalInt:Integer;
begin
HexStr:=UpperCase(HexStr);
LocalInt:=1;
Result:=0;
for i:=Length(HexStr) downto 1 do
begin
if HexStr[i] in ['0'..'9'] then
TempInt:=StrToInt(HexStr[i])
else
TempInt:=Ord(HexStr[i])-Ord('A')+10;
if i=Length(HexStr) then
LocalInt:=1
else
LocalInt:=LocalInt*16;
Result:=Result+TempInt*LocalInt;
end;
end;
function Encode8Bits(s:String):String;
var
i:Integer;
begin
Result:='';
for i:=1 to Length(s) do
Result:=Result+IntToHex(Ord(s[i]),2);
end;
function Decode8Bits(s:String):String;
var
i,Len:Integer;
TempStr:String;
begin
Result:='';
Len:=Length(s) Div 2;
for i:=0 to Len-1 do
begin
TempStr:=Copy(s,i*2+1,2);
Result:=Result+Chr(HexToInt(TempStr));
end;
end;
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -