CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

中文base64编码的问题!!!

楼主jzywh(江大鱼)2005-05-14 11:21:58 在 Web 开发 / ASP 提问

我用这段函数加密中文,却解不出来?不知是什么原因?  
   
  <%  
  response.write   base64Decode(base64Encode("我是中国人"))  
   
  %>  
   
   
  <%  
  '-------------------------------------------------  
  '函数功能:文字加密解密Base64算法  
  '加密函数:base64Encode(str)   as   String    
  '解密函数:base64Decode(str)   as   String  
  '-------------------------------------------------  
   
  const   BASE_64_MAP_INIT   =   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"    
  dim   nl    
  '   zero   based   arrays    
  dim   Base64EncMap(63)    
  dim   Base64DecMap(127)    
   
  '   must   be   called   before   using   anything   else    
  PUBLIC   SUB   initCodecs()    
      '   init   vars    
      nl   =   "<P>"   &   chr(13)   &   chr(10)    
      '   setup   base   64    
      dim   max,   idx    
      max   =   len(BASE_64_MAP_INIT)    
      for   idx   =   0   to   max   -   1    
          '   one   based   string    
          Base64EncMap(idx)   =   mid(BASE_64_MAP_INIT,   idx   +   1,   1)    
      next    
      for   idx   =   0   to   max   -   1    
          Base64DecMap(ASC(Base64EncMap(idx)))   =   idx    
      next    
  END   SUB    
   
  '   encode   base   64   encoded   string    
  PUBLIC   FUNCTION   base64Encode(plain)    
      if   len(plain)   =   0   then    
          base64Encode   =   ""    
          exit   function    
      end   if    
      dim   ret,   ndx,   by3,   first,   second,   third    
      by3   =   (len(plain)   \   3)   *   3    
      ndx   =   1    
      do   while   ndx   <=   by3    
          first     =   asc(mid(plain,   ndx+0,   1))    
          second   =   asc(mid(plain,   ndx+1,   1))    
          third     =   asc(mid(plain,   ndx+2,   1))    
          ret   =   ret   &   Base64EncMap((first   \   4)   AND   63   )    
          ret   =   ret   &   Base64EncMap(((first   *   16)   AND   48)   +   ((second   \   16)   AND   15   )   )    
          ret   =   ret   &   Base64EncMap(((second   *   4)   AND   60)   +   ((third   \   64)   AND   3   )   )    
          ret   =   ret   &   Base64EncMap(third   AND   63)    
          ndx   =   ndx   +   3    
      loop    
      '   check   for   stragglers    
      if   by3   <   len(plain)   then    
          first     =   asc(mid(plain,   ndx+0,   1))    
          ret   =   ret   &   Base64EncMap((first   \   4)   AND   63   )    
          if   (len(plain)   MOD   3   )   =   2   then    
  second   =   asc(mid(plain,   ndx+1,   1))    
  ret   =   ret   &   Base64EncMap(((first   *   16)   AND   48)   +   ((second   \16)   AND   15   ))    
  ret   =   ret   &   Base64EncMap(((second   *   4)   AND   60))    
          else    
  ret   =   ret   &   Base64EncMap((first   *   16)   AND   48)    
  ret   =   ret   &   "="    
          end   if    
          ret   =   ret   &   "="    
      end   if    
      base64Encode   =   ret    
  END   FUNCTION    
   
  '   decode   base   64   encoded   string    
  PUBLIC   FUNCTION   base64Decode(scrambled)    
      if   len(scrambled)   =   0   then    
          base64Decode   =   ""    
          exit   function    
      end   if  
      '   ignore   padding    
      dim   realLen    
      realLen   =   len(scrambled)    
      do   while   mid(scrambled,   realLen,   1)   =   "="    
          realLen   =   realLen   -   1    
      loop    
      dim   ret,   ndx,   by4,   first,   second,   third,   fourth    
      ret   =   ""    
      by4   =   (realLen   \   4)   *   4    
      ndx   =   1    
      do   while   ndx   <=   by4    
          first     =   Base64DecMap(asc(mid(scrambled,   ndx+0,   1)))    
          second   =   Base64DecMap(asc(mid(scrambled,   ndx+1,   1)))    
          third     =   Base64DecMap(asc(mid(scrambled,   ndx+2,   1)))    
          fourth   =   Base64DecMap(asc(mid(scrambled,   ndx+3,   1)))    
          ret   =   ret   &   chr(   ((first   *   4)   AND   255)   +       ((second   \   16)   AND   3))    
          ret   =   ret   &   chr(   ((second   *   16)   AND   255)   +   ((third   \   4)   AND   15)   )    
          ret   =   ret   &   chr(   ((third   *   64)   AND   255)   +     (fourth   AND   63)   )    
          ndx   =   ndx   +   4    
      loop    
      '   check   for   stragglers,   will   be   2   or   3   characters    
      if   ndx   <   realLen   then    
          first     =   Base64DecMap(asc(mid(scrambled,   ndx+0,   1)))    
          second   =   Base64DecMap(asc(mid(scrambled,   ndx+1,   1)))    
          ret   =   ret   &   chr(   ((first   *   4)   AND   255)   +       ((second   \   16)   AND   3))    
          if   realLen   MOD   4   =   3   then    
  third   =   Base64DecMap(asc(mid(scrambled,ndx+2,1)))    
  ret   =   ret   &   chr(   ((second   *   16)   AND   255)   +   ((third   \   4)   AND   15)   )    
          end   if    
      end   if    
      base64Decode   =   ret    
  END   FUNCTION    
   
  '   initialize    
  call   initCodecs    
   
  '   Testing   code    
  ' dim   inp,   encode    
  ' inp   =   "1k2.3#4@5*6%7(8<9Q0x"    
  ' encode   =   base64Encode(inp)    
  ' response.write   "Encoded   value   =   "   &   encode   &   "<br/>"  
  ' response.write   "Decoded   value   =   "   &   base64Decode(encode)   &   "<br/>"  
  %>  
   
  问题点数:100、回复次数:13Top

1 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-14 11:36:22 得分 0

上面的64Base是基于字节编码的  
   
  中文是双字节的  
   
  所以要先转换一下,把中文字符串转换成UF-8编码的字符串Top

2 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-14 11:39:10 得分 30

上面用的都是   Mid   Chr   Asc等不带B的函数  
   
  …………呵呵,当然不行了  
  这有一个UTF-8编码倒GB2312编码的转换函数  
   
  Public   Function   Bytes2BSTR(v)  
  Dim   r,i,t,n   :   r   =   ""  
  For   i   =   1   To   LenB(v)  
  t   =   AscB(MidB(v,i,1))  
  If   t   <   &H80   Then  
  r   =   r   &   Chr(t)  
  Else  
  n   =   AscB(MidB(v,i+1,1))  
  r   =   r   &   Chr(CLng(t)   *   &H100   +   CInt(n))  
  i   =   i   +   1  
  End   If  
  Next  
  Bytes2BSTR   =   r  
  End   Function  
   
  =========  
  从GB2312到UTF-8的也不难了Top

3 楼raas(朗仕)回复于 2005-05-14 11:42:06 得分 5

学习Top

4 楼jzywh(江大鱼)回复于 2005-05-14 12:03:42 得分 0

加密  
   
  GB2312编码     ->   UTF8  
   
   
  解密  
   
   
  UTF8     ->         GB2312编码  
   
  就是说需要2个转换函数Top

5 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-14 12:25:58 得分 0

是的  
   
  最好是你修改一下上面的Base64编码/解码函数  
  这样效率高的多  
  可以省去两次字符歘扫描Top

6 楼jzywh(江大鱼)回复于 2005-05-16 10:56:08 得分 0

不行啊,用   UTF-8编码之后再base64编码,得出的字符串不满足     base64的格式,而且解码出来是空的  
   
  <!--#include   virtual="/inc/security.asp"-->  
  <!--#include   virtual="/inc/base64.asp"-->  
  <%  
  dim   tempStr  
  tempStr     =     "werwerwrw你好啊!你好啊!你好啊!你好啊!"  
  tempStr     =     utf8Encode(tempStr)  
  response.write   tempStr   &   "<br>"  
  tempStr     =     base64Encode(base64Encode)  
  response.write   tempStr   &   "<br>"  
  %>Top

7 楼liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)回复于 2005-05-16 11:27:36 得分 20

加密  
   
  GB2312编码     ->   UTF8  
   
   
  解密  
   
   
  UTF8     ->         GB2312编码  
   
  就是说需要2个转换函数  
   
   
  看看笨狼的blog,里面也许有你要的东西Top

8 楼net_lover(【孟子E章】)回复于 2005-05-16 12:01:10 得分 30

<script   Language="Javascript"   runat=server>  
  var   keyStr   =   "ABCDEFGHIJKLMNOP"   +    
  "QRSTUVWXYZabcdef"   +    
  "ghijklmnopqrstuv"   +    
  "wxyz0123456789+/"   +    
  "=";    
   
  function   encode64(input)   {    
  input   =   escape(input);    
  var   output   =   "";    
  var   chr1,   chr2,   chr3   =   "";    
  var   enc1,   enc2,   enc3,   enc4   =   "";    
  var   i   =   0;    
   
  do   {    
  chr1   =   input.charCodeAt(i++);    
  chr2   =   input.charCodeAt(i++);    
  chr3   =   input.charCodeAt(i++);    
   
  enc1   =   chr1   >>   2;    
  enc2   =   ((chr1   &   3)   <<   4)   |   (chr2   >>   4);    
  enc3   =   ((chr2   &   15)   <<   2)   |   (chr3   >>   6);    
  enc4   =   chr3   &   63;    
   
  if   (isNaN(chr2))   {    
  enc3   =   enc4   =   64;    
  }   else   if   (isNaN(chr3))   {    
  enc4   =   64;    
  }    
   
  output   =   output   +    
  keyStr.charAt(enc1)   +    
  keyStr.charAt(enc2)   +    
  keyStr.charAt(enc3)   +    
  keyStr.charAt(enc4);    
  chr1   =   chr2   =   chr3   =   "";    
  enc1   =   enc2   =   enc3   =   enc4   =   "";    
  }   while   (i   <   input.length);    
   
  return   output;    
  }    
   
  function   decode64(input)   {    
  var   output   =   "";    
  var   chr1,   chr2,   chr3   =   "";    
  var   enc1,   enc2,   enc3,   enc4   =   "";    
  var   i   =   0;    
   
  //   remove   all   characters   that   are   not   A-Z,   a-z,   0-9,   +,   /,   or   =    
  var   base64test   =   /[^A-Za-z0-9\+\/\=]/g;    
  if   (base64test.exec(input))   {    
  alert("There   were   invalid   base64   characters   in   the   input   text.\n"   +    
  "Valid   base64   characters   are   A-Z,   a-z,   0-9,   '+',   '/',   and   '='\n"   +    
  "Expect   errors   in   decoding.");    
  }    
  input   =   input.replace(/[^A-Za-z0-9\+\/\=]/g,   "");    
   
  do   {    
  enc1   =   keyStr.indexOf(input.charAt(i++));    
  enc2   =   keyStr.indexOf(input.charAt(i++));    
  enc3   =   keyStr.indexOf(input.charAt(i++));    
  enc4   =   keyStr.indexOf(input.charAt(i++));    
   
  chr1   =   (enc1   <<   2)   |   (enc2   >>   4);    
  chr2   =   ((enc2   &   15)   <<   4)   |   (enc3   >>   2);    
  chr3   =   ((enc3   &   3)   <<   6)   |   enc4;    
   
  output   =   output   +   String.fromCharCode(chr1);    
   
  if   (enc3   !=   64)   {    
  output   =   output   +   String.fromCharCode(chr2);    
  }    
  if   (enc4   !=   64)   {    
  output   =   output   +   String.fromCharCode(chr3);    
  }    
   
  chr1   =   chr2   =   chr3   =   "";    
  enc1   =   enc2   =   enc3   =   enc4   =   "";    
   
  }   while   (i   <   input.length);    
   
  return   unescape(output);    
  }    
  Response.Write(("我是中国人"))  
  Response.Write(encode64("我是中国人"))  
  Response.Write(decode64(encode64("我是中国人")))  
  </script>    
   
   
  Top

9 楼net_lover(【孟子E章】)回复于 2005-05-16 12:02:35 得分 0

<script   Language="Javascript"   runat=server>  
  var   keyStr   =   "ABCDEFGHIJKLMNOP"   +    
  "QRSTUVWXYZabcdef"   +    
  "ghijklmnopqrstuv"   +    
  "wxyz0123456789+/"   +    
  "=";    
   
  function   encode64(input)   {    
  input   =   escape(input);    
  var   output   =   "";    
  var   chr1,   chr2,   chr3   =   "";    
  var   enc1,   enc2,   enc3,   enc4   =   "";    
  var   i   =   0;    
   
  do   {    
  chr1   =   input.charCodeAt(i++);    
  chr2   =   input.charCodeAt(i++);    
  chr3   =   input.charCodeAt(i++);    
   
  enc1   =   chr1   >>   2;    
  enc2   =   ((chr1   &   3)   <<   4)   |   (chr2   >>   4);    
  enc3   =   ((chr2   &   15)   <<   2)   |   (chr3   >>   6);    
  enc4   =   chr3   &   63;    
   
  if   (isNaN(chr2))   {    
  enc3   =   enc4   =   64;    
  }   else   if   (isNaN(chr3))   {    
  enc4   =   64;    
  }    
   
  output   =   output   +    
  keyStr.charAt(enc1)   +    
  keyStr.charAt(enc2)   +    
  keyStr.charAt(enc3)   +    
  keyStr.charAt(enc4);    
  chr1   =   chr2   =   chr3   =   "";    
  enc1   =   enc2   =   enc3   =   enc4   =   "";    
  }   while   (i   <   input.length);    
   
  return   output;    
  }    
   
  function   decode64(input)   {    
  var   output   =   "";    
  var   chr1,   chr2,   chr3   =   "";    
  var   enc1,   enc2,   enc3,   enc4   =   "";    
  var   i   =   0;    
   
  //   remove   all   characters   that   are   not   A-Z,   a-z,   0-9,   +,   /,   or   =    
  var   base64test   =   /[^A-Za-z0-9\+\/\=]/g;    
  if   (base64test.exec(input))   {    
  alert("There   were   invalid   base64   characters   in   the   input   text.\n"   +    
  "Valid   base64   characters   are   A-Z,   a-z,   0-9,   '+',   '/',   and   '='\n"   +    
  "Expect   errors   in   decoding.");    
  }    
  input   =   input.replace(/[^A-Za-z0-9\+\/\=]/g,   "");    
   
  do   {    
  enc1   =   keyStr.indexOf(input.charAt(i++));    
  enc2   =   keyStr.indexOf(input.charAt(i++));    
  enc3   =   keyStr.indexOf(input.charAt(i++));    
  enc4   =   keyStr.indexOf(input.charAt(i++));    
   
  chr1   =   (enc1   <<   2)   |   (enc2   >>   4);    
  chr2   =   ((enc2   &   15)   <<   4)   |   (enc3   >>   2);    
  chr3   =   ((enc3   &   3)   <<   6)   |   enc4;    
   
  output   =   output   +   String.fromCharCode(chr1);    
   
  if   (enc3   !=   64)   {    
  output   =   output   +   String.fromCharCode(chr2);    
  }    
  if   (enc4   !=   64)   {    
  output   =   output   +   String.fromCharCode(chr3);    
  }    
   
  chr1   =   chr2   =   chr3   =   "";    
  enc1   =   enc2   =   enc3   =   enc4   =   "";    
   
  }   while   (i   <   input.length);    
   
  return   unescape(output);    
  }    
  Response.Write(("我是中国人"))  
  Response.Write(encode64("我是中国人"))  
  Response.Write(decode64(encode64("我是中国人")))  
  </script>    
   
   
  Top

10 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-05-16 12:07:41 得分 15

如孟子的代码。  
  孟子,web开发版的牛魔王。Top

11 楼jzywh(江大鱼)回复于 2005-05-18 08:07:20 得分 0

谢谢,我用UrlEncode解决了Top

12 楼supertj(supertj)回复于 2005-05-18 10:26:58 得分 0

请问你的怎么用UrlEncode解决的啊?我也碰到类似的问题.教教我吧?  
   
  如果方便的,发份源码我吧?还有quoted-printable我也不会解,能教教我吗?  
   
  我的信箱,jacky.tang@psh.com.cn.非常非常感谢.Top

13 楼supertj(supertj)回复于 2005-05-20 09:26:15 得分 0

没人回答了?Top

相关问题

  • 编码?中文?郁闷!
  • 中文编码问题
  • 中文编码问题
  • JAVA中文编码问题
  • MySQL中文编码问题
  • 中文编码转换
  • 中文编码问题!在线等待
  • servlet输出xml中文编码问题
  • 急救!URL流中文编码问题!!!!!!!!!
  • mysql数据库中文编码问题

关键词

  • 编码
  • 函数
  • base64
  • idx
  • ndx
  • utf8
  • encode
  • plain
  • gb2312
  • max

得分解答快速导航

  • 帖主:jzywh
  • eglic
  • raas
  • liuxiaoyi666
  • net_lover
  • superdullwolf

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo