操作字符串,求两个相反的函数。
1、缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。
function Encode1(var s:String):String;
var
i,j,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
//j 用于移位计数
i:=1;j:=0;
while i<=len do
begin
if i<len then
//数据变换
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;
FmtStr(t,'%2.2X',[cur]);
Result:=Result+t;
inc(i);
//移位计数达到7位的特别处理
j:=(j+1) mod 7;
if j=0 then inc(i);
end;
end;
2、通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换
function TForm1.EncodeCn(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]);
FmtStr(t, '%4.4X', [cur]);
Result := Result + t;
inc(i);
end;
end;
我现在想求两个相反的函数。
问题点数:100、回复次数:17Top
1 楼lyguo(愚人(每天顶几顶挣分升星星)http://zz.ihenan.cn/map/)回复于 2004-11-25 18:16:13 得分 2
帮你顶Top
2 楼anbangs(大邦)回复于 2004-11-26 00:31:49 得分 2
upTop
3 楼ICMGDCHN(忘记感动)回复于 2004-11-26 09:02:54 得分 0
第一个没看明白
第二个:
Unicode2Chinese:
function Unicode2Chinese(sUnicode:string):string;
var
i:integer;
sTemp:string;
begin
for i:=0 to Length(sUnicode) do
begin
if i mod 4 =0 then
begin
sTemp:=copy(sUnicode,i-3,4);
sTemp:=WideChar(StrToIntDef('$' +sTemp, 0));
Result:=Result+sTemp;
end;
end;
end;
Top
4 楼cjf1009(农民程序员)回复于 2004-11-26 09:04:37 得分 0
自己顶一下Top
5 楼cjf1009(农民程序员)回复于 2004-11-26 09:13:43 得分 0
第一个是pdu的编码函数,有一段这样的解释:
设需要发送的短消息内容为“Hi”,使用的GSM字符集为7位编码。首先将字符转换为7位的二进制,然后,将后面字符的位调用到前面,补齐前面的差别。例如:H翻译成1001000,i翻译成1101001,显然H的二进制编码不足八位,那么就将i的最后一位补足到H的前面。那么就成了11001000(C8),i剩下六位110100,前面再补两个0,变成00110100(34),于是“Hi”就变成了两个八进制数 C8 34。Top
6 楼cjf1009(农民程序员)回复于 2004-11-26 09:53:36 得分 0
我刚才查资料,有人说这个函数是不可逆的,这不可能吧Top
7 楼nyf1220(我是党员----不过听说最近风声紧,打算换名字)回复于 2004-11-26 09:56:38 得分 2
呵呵,比较繁,Top
8 楼ICMGDCHN(忘记感动)回复于 2004-11-26 10:52:59 得分 0
GSM解码:
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nSrc; // 源字符串的计数值
int nDst; // 目标解码串的计数值
int nByte; // 当前正在处理的组内字节的序号,范围是0-6
unsigned char nLeft; // 上一字节残余的数据
// 计数值初始化
nSrc = 0;
nDst = 0;
// 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
while(nSrc<nSrcLength)
{
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> (7-nByte);
// 修改目标串的指针和计数值
pDst++;
nDst++;
// 修改字节计数值
nByte++;
// 到了一组的最后一个字节
if(nByte == 7)
{
// 额外得到一个目标解码字节
*pDst = nLeft;
// 修改目标串的指针和计数值
pDst++;
nDst++;
// 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
}
// 修改源串的指针和计数值
pSrc++;
nSrc++;
}
*pDst = 0;
// 返回目标串长度
return nDst;
}Top
9 楼cjf1009(农民程序员)回复于 2004-11-26 11:37:41 得分 0
楼上的,这个不是delphi的语法吧!!!我看不懂啊,能不能帮我翻译成delphi的?好人做到底嘛,你上面那个函数可以了。
Top
10 楼cjf1009(农民程序员)回复于 2004-11-26 13:35:07 得分 0
再顶Top
11 楼honglei520()回复于 2004-11-26 13:57:45 得分 2
okTop
12 楼ICMGDCHN(忘记感动)回复于 2004-11-26 14:45:16 得分 0
C语言的语法看不懂吗?晕倒
逐句翻译.
function gsmDecode7bit(const pSrc:pchar;pDst:pchar;nSrcLength:integer);
var
nSrc,nDst,nByte:integer;
nLeft:integer;
begin
nSrc:=0;
nDst:=0;
nByte:=0;
nLeft:=chr(0);
while nSrc<nSrcLength do
begin
pDst^:=chr(((ord(pSrc^) shl nByte) or nLeft) and $7F);
nLeft:=ord(pSrc^) shr (7-nByte);
inc(pDst);
inc(nDst);
inc(nByte);
if nByte=7 then
begin
pDst^=chr(nLeft);
inc(pDst);
inc(nDst);
nByte:=0;
nLeft:=0;
end;
inc(pSrc);
inc(nSrc);
end;
pDst^:=chr(0);
result:=nDst;
end;
只是翻译过来,未经测试.
另:你是不是想写短信程序呀?我有个编解码的UNIT
Top
13 楼cjf1009(农民程序员)回复于 2004-11-27 13:42:56 得分 0
是啊,我就是在做短信的东西,楼上大哥,能不能给我点资料啊,尤其是你的那个UNIT
cjf1009@163.comTop
14 楼cjf1009(农民程序员)回复于 2004-11-29 09:55:46 得分 0
自己顶一下。Top
15 楼ICMGDCHN(忘记感动)回复于 2004-11-29 15:10:19 得分 92
这几天宿舍里上不了网,公司的机器上没那个UNIT
其实也没什么东西的,就是些编解码的函数而已.我发几个函数给你看下吧
function HexCharToInt(HexToken : char):Integer; //十六进制转整数
begin
{if HexToken>#97 then HexToken:=Chr(Ord(HexToken)-32);
{ use lowercase aswell }
Result:=0;
if (HexToken>#47) and (HexToken<#58) then { chars 0....9 }
Result:=Ord(HexToken)-48
else if (HexToken>#64) and (HexToken<#71) then { chars A....F }
Result:=Ord(HexToken)-65 + 10;
end;
function HexCharToBin(HexToken : char): string; //十六进制转二进制
var DivLeft : integer;
begin
DivLeft:=HexCharToInt(HexToken); { first HEX->BIN }
Result:='';
{ Use reverse dividing }
repeat { Trick; divide by 2 }
if odd(DivLeft) then { result = odd ? then bit = 1 }
Result:='1'+Result { result = even ? then bit = 0 }
else
Result:='0'+Result;
DivLeft:=DivLeft div 2; { keep dividing till 0 left and length = 4 }
until (DivLeft=0) and (length(Result)=4); { 1 token = nibble = 4 bits }
end;
function HexToBin(HexNr : string): string;
{ only stringsize is limit of binnr }
var Counter : integer;
begin
Result:='';
for Counter:=1 to length(HexNr) do
Result:=Result+HexCharToBin(HexNr[Counter]);
end;
function pow(base, power: integer): integer; //乘方
var counter : integer;
begin
Result:=1;
for counter:=1 to power do
Result:=Result*base;
end;
function BinStrToInt(BinStr : string) : integer; //二进制转INT
var counter : integer;
begin
if length(BinStr)>16 then
raise ERangeError.Create(#13+BinStr+#13+
'is not within the valid range of a 16 bit binary.'+#13);
Result:=0;
for counter:=1 to length(BinStr) do
if BinStr[Counter]='1' then
Result:=Result+pow(2,length(BinStr)-counter);
end;
function DecodeSMS7Bit(PDU : string):string; //SMS解码
var OctetStr : string;
OctetBin : string;
Charbin : string;
PrevOctet: string;
Counter : integer;
Counter2 : integer;
begin
PrevOctet:='';
Result:='';
for Counter:=1 to length(PDU) do
begin
if length(PrevOctet)>=7 then { if 7 Bit overflow on previous }
begin
if BinStrToInt(PrevOctet)<>0 then
Result:=Result+Chr(BinStrToInt(PrevOctet))
else Result:=Result+' ';
PrevOctet:='';
end;
if Odd(Counter) then { only take two nibbles at a time }
begin
OctetStr:=Copy(PDU,Counter,2);
OctetBin:=HexToBin(OctetStr);
Charbin:='';
for Counter2:=1 to length(PrevOctet) do
Charbin:=Charbin+PrevOctet[Counter2];
for Counter2:=1 to 7-length(PrevOctet) do
Charbin:=OctetBin[8-Counter2+1]+Charbin;
if BinStrToInt(Charbin)<>0 then Result:=Result+Chr(BinStrToInt(CharBin))
else Result:=Result+' ';
PrevOctet:=Copy(OctetBin,1,length(PrevOctet)+1);
end;
end;
end;
function ReverseStr(SourceStr : string) : string; //字符串反转
var Counter : integer;
begin
Result:='';
for Counter:=1 to length(SourceStr) do
Result:=SourceStr[Counter]+Result;
end;
end.Top
16 楼ICMGDCHN(忘记感动)回复于 2004-11-29 15:17:34 得分 0
http://www.delphifans.com/SoftView/SoftView_131.html
这里有串口相关的源码Top
17 楼cjf1009(农民程序员)回复于 2004-11-30 10:21:05 得分 0
ok了,揭贴。Top





