关于手机短信息SMS开发—编码和解码(ASCII转化为7bit编码)

Yings 2002-11-12 09:45:34
我已有BCB的代码,当我不熟悉BCB,希望诸位大侠指点

String __stdcall EncodeEnglish(String InputStr)
{
int n,len,cur;
String tempstr,returnstr;
unsigned char mid1[2],mid2[2];
len=InputStr.Length();
n=0;
for(int i=1;i<=len;i++)
{
if(i<len)
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
strcpy(mid2,InputStr.SubString(i+1,1).c_str());
cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
}
else
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
cur=(mid1[0]>>n)& 0x7f;
}
FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
n=(n+1)%7;
if (n==0)
i++;
}
return returnstr;
}

int ReturnHex(int Value)
{
switch (Value)
{
case 0:
Value=0x7f;
break;
case 1:
Value=0x3f;
break;
case 2:
Value=0x1f;
break;
case 3:
Value=0x0f;
break;
case 4:
Value=0x07;
break;
case 5:
Value=0x03;
break;
case 6:
Value=0x01;
break;
case 7:
Value=0x00;
break;
}
return Value;
}

String __stdcall DecodeEnglish (String InputStr)
{
unsigned char InStr[300];
char OutStr[300];
String str;
int j=0,i=0;
int Point=0;
int temp;
memset(InStr,0,301);
memset(OutStr,0,301);
for(int i=0;i
{
str="0x"+InputStr.SubString(i+1,2);
InStr[i/2]=StrToInt(str);
}
while(j<=InputStr.Length()/2)
{
if(Point==0)
OutStr[i]=InStr[j]&ReturnHex(Point);
else
OutStr[i]=((InStr[j]&ReturnHex(Point))<>(8-Point));
if(Point%7==0&&Point!=0)
Point=0;
else
Point=Point+1;
i++;
j=i-(i/8);
}
OutStr[12]=((InStr[12]&0x07)<<5)|(InStr[11]>>(8-5));
return AnsiString(OutStr);
}
...全文
599 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yings 2002-11-12
  • 打赏
  • 举报
回复
CString EnCodeASCII(CString strInput)
{
int n,len,cur;
CString tempstr,returnstr;
unsigned char mid1[2],mid2[2];
len=strInput.GetLength();
n=0;
for(int i=0;i<len;i++)
{
if(i<len-1)
{
mid1[0]=strInput[i];
mid2[0]=strInput[i+1];
cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
}
else
{
mid1[0]=strInput[i];
cur=(mid1[0]>>n)& 0x7f;
}
tempstr.Format("%2.2X",cur);
returnstr=returnstr+tempstr;

n=(n+1)%7;
if (n==0)
i++;
}
return returnstr;
}
Yings 2002-11-12
  • 打赏
  • 举报
回复
你要编码的话用encode就行了

下面是解码时用的
两个函数是配套使用的就是 编码后的字符串解码后能恢复到编码前的字符串

编码的VC版我已经调好了如下
CString EnCodeASCII(CString strInput)
{
int n,len,cur;
CString tempstr,returnstr;
unsigned char mid1[2],mid2[2];
//len 为输入字符长度
len=strInput.GetLength();
//.Length();
n=0;
for(int i=0;i<len;i++)
{
if(i<len-1)
{
mid1[0]=strInput[i];//strcpy(mid1,InputStr.SubString(i,1).c_str());
mid2[0]=strInput[i+1];//strcpy(mid2,InputStr.SubString(i+1,1).c_str());
cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
}
else
{
mid1[0]=strInput[i];//strcpy(mid1,InputStr.SubString(i,1).c_str());
cur=(mid1[0]>>n)& 0x7f;
}
FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));
cprintf(tempstr,"%2.2X",cur);
tempstr.Format("%2.2X",cur);
returnstr=returnstr+tempstr;

n=(n+1)%7;
if (n==0)
i++;
}
return returnstr;
}
javanew 2002-11-12
  • 打赏
  • 举报
回复
sorry,没看清 decode用到了returnhex

不过1234encoe我这里得到的是b2190d00
javanew 2002-11-12
  • 打赏
  • 举报
回复
ReturnHex(int Value)你这个函数有啥用?
javanew 2002-11-12
  • 打赏
  • 举报
回复
感觉传进来的都是全角字符吧
Yings 2002-11-12
  • 打赏
  • 举报
回复
up
Yings 2002-11-12
  • 打赏
  • 举报
回复
up
javanew 2002-11-12
  • 打赏
  • 举报
回复
其实我比较有兴趣的,不过我不会
Yings 2002-11-12
  • 打赏
  • 举报
回复
没人回答吗???


up,up
Yings 2002-11-12
  • 打赏
  • 举报
回复
我看到的资料时这样解释编码的

通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。

我怎么也看不到移位的结果。
我觉得移位后应该是01100010 11001001 10011011 01000000
Yings 2002-11-12
  • 打赏
  • 举报
回复
程序要求的输出为

例如:1234 编码后得到31D98C06

  2进制表示

  8位编码 00110001 00110010 00110011 00110100

  7位编码 00110001 11011001 10001100 00000110

javanew 2002-11-12
  • 打赏
  • 举报
回复
呵呵,我也写好了VC的,但搞不懂为什么要这样转,是什么码?
Yings 2002-11-12
  • 打赏
  • 举报
回复
我搞定了

分只好送给javanew(我是java新手)了

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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