CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高手请进!-----关于CString与BYTE相互转化的问题!

楼主stoney0914(石头)2005-06-01 09:45:24 在 VC/MFC / 基础类 提问

非常谢谢!  
  我要进行的操作过程是这样的:  
   
  CString   sTest="ABC";//明文  
  CString   sKEY="ABC";//   密匙  
   
  我的目的是将这两个串异或,由此将明文加密.  
  解密是将结果与密匙再进行一次异或.  
   
  我知道CString是不能直接进行按位异或的,得先转化为BYTE类型.  
   
  请问这个过程如何实现?特别感谢!  
  问题点数:20、回复次数:14Top

1 楼sungengyu(快乐机器)回复于 2005-06-01 09:50:52 得分 0

CString   重载了   operator   const   CHAR*   可以直接转化为   const   CHAR*    
   
   
   
  Top

2 楼stoney0914(石头)回复于 2005-06-01 09:53:58 得分 0

能不能说说具体怎么实现啊?  
  谢谢!Top

3 楼sungengyu(快乐机器)回复于 2005-06-01 09:54:39 得分 0

 
  CString     重载了   operator   []   ,sTest[i]就可以取得第i个字符。  
   
  Top

4 楼sungengyu(快乐机器)回复于 2005-06-01 10:00:03 得分 20

int   len   =   sTest.GetLength()   ;    
  char   *buffer   =   new   char[len+1]   ;    
  buffer[len]   =   0   ;    
   
  ASSERT(len>=sKey.GetLength()   ;   //   密匙   的长度不要小于明文的长度  
   
  for(int   i=0   ;   i<len   ;   i++)  
  {  
        buffer[i]   =   sTest[i]   ^   sKey[i]   ;   //   异或  
  }  
  //   得到的   buffer   就是密文。  
  delete   []buffer   ;Top

5 楼sungengyu(快乐机器)回复于 2005-06-01 10:01:46 得分 0

ASSERT(len>=sKey.GetLength()   ;   //   密匙   的长度不要小于明文的长度  
   
  --------------------------------------------------------------------  
   
  这个写错了,应该是  
   
  ASSERT(   len   <=   sKey.GetLength()   )   ;    
   
  抱歉。Top

6 楼stoney0914(石头)回复于 2005-06-01 10:05:07 得分 0

那异或操作呢?  
  是这样吗?  
  int   index;  
  index=0;  
  for(int   i=0;i<sTest.GetLength;i++)  
  {  
  sTest[i]=sTest[i]^sKEY[(index++)];  
  if(index=sKEY.GetLength)index=0;  
  }  
  自己很笨,这个问题弄了好几天!  
  希望能得到帮助.Top

7 楼gwinner(动力引擎)回复于 2005-06-01 10:06:10 得分 0

void  
  EncryptPsw(const   CString   &   sPsw,   const   CString   &   sKey,   BYTE   *   pbEncryptedPsw,   const   int   &   nBuffLenEncryptedPsw)  
  {  
  ASSERT(pbEncryptedPsw);  
  ASSERT(sKey.GetLength()   >=   sPsw.GetLength());  
  ASSERT(sPsw.GetLength()   <=   nBuffLenEncryptedPsw);  
   
  for   (int   i   =   0;   i   <   sPsw.GetLength();   i++)  
  {  
  pbEncryptedPsw[i]   =   sPsw[i]   ^   sKey[i];  
  }  
  }Top

8 楼stoney0914(石头)回复于 2005-06-01 10:08:38 得分 0

谢谢啦!  
  那buffer里的内容如何再变成字符串CString呢?Top

9 楼sungengyu(快乐机器)回复于 2005-06-01 10:14:32 得分 0

1.   sTest[i]   =   sTest[i]   ^   sKey[index++]   ;  
    //   这个地方过不去,sTest[i]   好像只能读不能写。  
     
  2.   sTest.GetLength     这个地方漏了括号,应该是   sTest.GetLength()  
   
  3.   if(index=sKey.GetLength)    
  判断等于要用   ==   ,不能用   =  
   
   
  Top

10 楼sungengyu(快乐机器)回复于 2005-06-01 10:17:25 得分 0

稍微改了一点:  
   
  int   len   =   sTest.GetLength()   ;    
  char   *buffer   =   new   char[len+1]   ;    
  buffer[len]   =   0   ;    
   
  int   index   =   0   ;    
  for(int   i=0   ;   i<len   ;   i++)  
  {  
        buffer[i]   =   sTest[i]   ^   sKey[index++]   ;   //   异或  
        if(   index   ==   sKey.GetLength()   )   index   =   0   ;    
  }  
  //   得到的   buffer   就是密文。  
   
  CString   answer   =   buffer   ;   //   直接对   CString   赋值就行了。  
  delete   []buffer   ;  
   
   
  Top

11 楼stoney0914(石头)回复于 2005-06-01 10:30:38 得分 0

下面的程序进行调试后,结果是"qrs",结果不应该是这个吧!?  
     
              CString   sTest="ABC";//明文  
              CString   sKey="0";//   密匙  
   
   
              int   len   =   sTest.GetLength()   ;    
              char   *buffer   =   new   char[len+1]   ;    
              buffer[len]   =   0   ;    
   
              int   index   =   0   ;    
              for(int   i=0   ;   i<len   ;   i++)  
      {  
                  buffer[i]   =   sTest[i]   ^   sKey[index++]   ;   //   异或  
                  if(   index   ==   sKey.GetLength()   )   index   =   0   ;    
      }  
              //   得到的   buffer   就是密文。  
   
              CString   answer   =   buffer   ;   //   直接对   CString   赋值就行了。  
              delete   []buffer   ;  
   
           
  AfxMessageBox(answer);Top

12 楼sungengyu(快乐机器)回复于 2005-06-01 10:41:16 得分 0

'A'   ^   '0'   =   'q'  
   
  'A'   =   0x30   ;   //   00110000  
  '0'   =   0x41   ;   //   01000001  
  'q'   =   0x71   ;   //   01110001  
   
   
  有问题么?  
  Top

13 楼stoney0914(石头)回复于 2005-06-01 10:47:16 得分 0

'A'的ASCII码是:65,   转化为16进制是41H啊?  
  '0'是00H  
  Top

14 楼stoney0914(石头)回复于 2005-06-01 10:51:49 得分 0

明白了,隆重谢谢!  
  感谢的一塌糊涂!Top

相关问题

  • LPWSTR-CString的相互转化?
  • string 和 byte[]转化
  • byte类型转化
  • float转化为byte
  • CString如何转化为CTime
  • CString怎样转化成char?
  • CString如何转化为LPBYTE?
  • CString怎么转化成CTime?
  • 如何转化string to BYTE?
  • string 如何转化为byte[]

关键词

  • 转化
  • 异或
  • stest
  • getlength
  • cstring
  • 密匙
  • 长度
  • skey
  • 明文
  • len

得分解答快速导航

  • 帖主:stoney0914
  • sungengyu

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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