其实也是一个加密码算法,具体
算法请参照网上相关资料。
'将8bit转为7bit
'E8 32 9B FD 46 97 D9 EC 37
Public Function Encrypt7To8(strSource As String) As String
   Dim StrHex As String
   Dim strRe As String
   Dim StrBinary As String
   Dim LngLength As Integer
   Dim IntFirst As Integer
   Dim newStrBinary As String
   Dim newStrHex As String
   Dim strResult As String
   
   LngLength = Len(strSource)
   StrHex = StringToHex(strSource)   '16
   strRe = StrRecovent(StrHex)       '反转
   StrBinary = From16To2(strRe, True)     '16 to 2  7bit
   
   IntFirst = 8 - (LngLength Mod 8)
   If IntFirst <> 8 Then
      newStrBinary = VBA.Right("00000000" & VBA.Left(StrBinary, IntFirst), 8) & VBA.Right(StrBinary, Len(StrBinary) - IntFirst)
   Else
      newStrBinary = StrBinary
   End If
   
   '2 to 16 8bit
   newStrHex = From2To16(newStrBinary)
   ''反转
   strResult = StrRecovent(newStrHex)
   
   Encrypt7To8 = strResult
End FunctionPublic Function Decrypt8To7(strSource As String) As String
  Dim intLength As Integer
  Dim strRe As String
  Dim strResult As String
  Dim StrBinary As String
  Dim newStrBinary As String
  Dim Str8 As String
  Dim newStrHex As String
  Dim newRe As String
  Dim strTemp As String
  Dim i As Integer
  
  intLength = Len(strSource) / 2
  strRe = StrRecovent(strSource)  '反转
  StrBinary = From16To2(strRe, False)   '16 to 2 8bit
  
  If Len(StrBinary) Mod 7 <> 0 Then
  'VBA.Right("0000000" & VBA.Left(StrBinary, (Len(StrBinary) Mod 7)), 7) &
     newStrBinary = VBA.Right(StrBinary, (Len(StrBinary) - (Len(StrBinary) Mod 7)))
  Else
     newStrBinary = StrBinary
  End If  
  Str8 = StrRe7to8(newStrBinary)
  '2 to 16
  newStrHex = From2To16(Str8)
  ''反转
  newRe = StrRecovent(newStrHex)
  ''转为字符
  For i = 1 To Len(newRe) / 2
     strTemp = ChrW(CInt(Val("&H" & VBA.Mid(newRe, (i - 1) * 2 + 1, 2))))
     strResult = strResult & strTemp
  Next
  
  Decrypt8To7 = strResult
End Function

解决方案 »

  1.   

    我也贴一个,不过是用VC写的,楼主要写文章也可以加进去,不过要著名出处啊,呵呵
    PSTR CShortMDlg::DataToStr(char *Databuf)
    {
      //8个字符为一段;
      /*把每个字符要移到前一字符(第一字符除外)的位算出 */
      int DataLen;
      char DataTemp[200];
      int i;
      BYTE ChY[50],ChM[50],ChYM[50]; //依次为字符的HEX表示,与字符相与的数,移位后的数
      BYTE Dest,Ch;
      CString DataDest;
      int Hi,Li;   sprintf(DataTemp,"%s",Databuf);
      DataLen=strlen(DataTemp);
        
     for (i=0;i<DataLen;i++)
     {
            Ch=DataTemp[i]; //ASCII码
    ChY[i]=Ch & (CalaMe(i%8) - 1);      //与该位字符相 与 的数
    ChM[i]=Ch >> (i%8);          //字符的十六进制移位后的值
    ChYM[i]=ChY[i] << (8-(i%8)); //把要移位的数转到最高位
            
     }
     for (i=0;i<DataLen-1;i++)
     {
     if (i==0 || ((i+1) % 8)!=0)
     {
     Dest=ChYM[i+1]+ChM[i];
     Hi=Dest / 16;
     Li=Dest % 16;
     DataDest=DataDest+DecToHex(Hi)+DecToHex(Li);
     }
     }
     if (ChM[DataLen]!=0)
     {
       Hi=ChM[DataLen-1] / 16;
       Li=ChM[DataLen-1] % 16;
       DataDest=DataDest+DecToHex(Hi)+DecToHex(Li);
     }
      
       sprintf(Databuf,"%s",DataDest);
      return Databuf;
    }
      

  2.   

    有没有搞错??????把字符串加密部分当成中短信发送的核心源码?!
    那WINDOWS XP的核心源码岂不是图片处理???
      

  3.   

    关注。是否可以把代码发给我看看?
    [email protected]
    谢谢
    ffish——胖胖鱼
      

  4.   

    To:GetWindowPos(阿汪) 
    你少见多怪,这是用手机模块收发短信,把要发送的字符压缩的算法
      

  5.   

    难到发短信的核心是在于怎么压缩字符吗?压缩了字符就能发短信了?
    那为什么WINZIP和WINRAR这两只软件不能发短信呢?
      

  6.   

    To:GetWindowPos(阿汪) 
    GSM只支持ASCII码值从0X00到0X7F的128个字符,这些值只需要7bit去定义,而SMS报文是以8bit字节序列传输的,故GSM使用一种编码方式将7bitASCII码值序列压缩成8bit字节序列。其他的操作只是调用规定的命令就行了,所以说压缩字符就是核心,呵呵
      

  7.   

    To: GetWindowPos(阿汪) ( ) 信誉:64 
    也许你个人认为这只是一个压缩或者是个
    加密算法罢了,但我想
    如果用这手机收发短信上,它不单单是个算法。
    只要是它是一种标准规则,没有这个规则我们不能
    成功发送和接收短信。