操作字符串,求两个相反的函数。

cjf1009 2004-11-25 05:14:54
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;

我现在想求两个相反的函数。
...全文
400 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjf1009 2004-11-30
  • 打赏
  • 举报
回复
ok了,揭贴。
cjf1009 2004-11-29
  • 打赏
  • 举报
回复
自己顶一下。
ICMGDCHN 2004-11-29
  • 打赏
  • 举报
回复
http://www.delphifans.com/SoftView/SoftView_131.html

这里有串口相关的源码
ICMGDCHN 2004-11-29
  • 打赏
  • 举报
回复
这几天宿舍里上不了网,公司的机器上没那个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.
cjf1009 2004-11-27
  • 打赏
  • 举报
回复
是啊,我就是在做短信的东西,楼上大哥,能不能给我点资料啊,尤其是你的那个UNIT
cjf1009@163.com
肥仔胧 2004-11-26
  • 打赏
  • 举报
回复
up
cjf1009 2004-11-26
  • 打赏
  • 举报
回复
楼上的,这个不是delphi的语法吧!!!我看不懂啊,能不能帮我翻译成delphi的?好人做到底嘛,你上面那个函数可以了。
ICMGDCHN 2004-11-26
  • 打赏
  • 举报
回复
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;
}
nyf1220 2004-11-26
  • 打赏
  • 举报
回复
呵呵,比较繁,
cjf1009 2004-11-26
  • 打赏
  • 举报
回复
我刚才查资料,有人说这个函数是不可逆的,这不可能吧
cjf1009 2004-11-26
  • 打赏
  • 举报
回复
第一个是pdu的编码函数,有一段这样的解释:

设需要发送的短消息内容为“Hi”,使用的GSM字符集为7位编码。首先将字符转换为7位的二进制,然后,将后面字符的位调用到前面,补齐前面的差别。例如:H翻译成1001000,i翻译成1101001,显然H的二进制编码不足八位,那么就将i的最后一位补足到H的前面。那么就成了11001000(C8),i剩下六位110100,前面再补两个0,变成00110100(34),于是“Hi”就变成了两个八进制数 C8 34。
cjf1009 2004-11-26
  • 打赏
  • 举报
回复
自己顶一下
ICMGDCHN 2004-11-26
  • 打赏
  • 举报
回复
第一个没看明白

第二个:

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;

ICMGDCHN 2004-11-26
  • 打赏
  • 举报
回复
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

honglei520 2004-11-26
  • 打赏
  • 举报
回复
ok
cjf1009 2004-11-26
  • 打赏
  • 举报
回复
再顶
lyguo 2004-11-25
  • 打赏
  • 举报
回复
帮你顶

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧