关于类型匹配的一个问题

live_for_you 2009-08-28 10:55:23
老师叫用MFC我做一个DES加密器,DES代码都找到了
我将自己的EDIT编辑框接收到的明文密钥都命成CString类型
CString mingwen;
CString miyue;
CString miwen;
CString miwen1;
CString miyue1;
CString mingwen1;

下面是DES代码的加密函数:

void Encode(int *str,int *keychar)


最后它说:没有找到接受“void”类型的右操作数的运算符(或没有可接受的转换)
然后我改成了miwen=CString.Format("%d",Encode(strkey,key2));想转换类型
它又说“CString”: 将此类型用作表达式非法,

如果谁要完整代码就说

怎么样就合理使用在别处找的代码,而不出现这些问题

感觉到自己连最简单的MFC都不会
...全文
243 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
live_for_you 2009-08-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 huziwu 的回复:]
miwen.Format("%d",Encode(strkey,key2));
肯定有问题,因为Encode的返回值类型为void即无返回值,你是获不到东西的

错误提示 :
CStringT <BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”
是由于Unicode引起的,可以改为:
miwen.Format(_T("%d"),Encode(strkey,key2)); //但获得值还是不对
你可以这样:
Encode(strkey,key2)
miwen.Format(_T("%s"),(TCHAR *)strkey);
或者:
for(int i=0;i <8;i++)//8为你strkey的长度

    miwen.Format(miwen+_T(" %d"),strkey[i]);

[/Quote]
这个确实不报错,但是调试的时候输入明文和密钥点击加密的时候会报错


Expression:(ichar>=0)&&(ichar<=GetLength())

For information on how your program can cause an assertion failure,see the visual C++documentation on asserts.
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
帮帮忙啊~~
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
这就是我找的DES代码
我想知道的就是如何把这个代码嵌入到MFC中
在对话框中获得输入,显示输出
请各位高手指教
谢谢


#include<stdio.h>
#include<string.h>
void EncodeMain(); //EncodeMain function
void DecodeMain(); //Sorry ,it has not used
void Decode(int *str,int *keychar); //decode :input 8 chars,8 keychars
void Encode(int *str,int *keychar); //encode: input 8 chars,8 keychars
void keyBuild(int *keychar); //create key array
void StrtoBin(int *midkey,int *keychar); //change into binary
void keyCreate(int *midkey2,int movebit,int i); //call by keyBuild
void EncodeData(int *lData,int *rData,int *srt); //encodedata function
void F(int *rData,int *key); //F function
void Expand(int *rData,int *rDataP); //Expand function
void ExchangeS(int *rDataP,int *rData); //S-diagram change
void ExchangeP(int *rData); //P change
void FillBin(int *rData,int n,int s); // data to binary;call by S-Diagram change function
void DecodeData(int *str,int *lData,int *rData); //DecodeData from binary
int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, //initial change
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,
};
int IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, //opp initial change
38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
};
int s[][4][16]={{ //S-diagram array
{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}
},
{
{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}
},
{
{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},
{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},
{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},
{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}
},
{
{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},
{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},
{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}
},
{
{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},
{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},
{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},
{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}
},
{
{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},
{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},
{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},
{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}
},
{
{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},
{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},
{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},
{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}
},
{
{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},
{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},
{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},
{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}
}
};
int Ex[48]={ 32,1,2,3,4,5, //Expand array
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1
};
int P[32]={16,7,20,21, //P-change
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25
};
int PC1[56]={57,49,41,33,25,17,9, //PC-1 in keyBuild
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,33,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4
};
int PC2[48]={14,17,11,24,1,5, //PC-2 in keyBuild
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32
};

///////////////////////////////////////////////////////////////////////

int key[16][48];
char str[8];
void main() //main function
{
EncodeMain();

}


void EncodeMain() //EncodeMain function
{
int i;

char keychar[8];

int key2[8];
int strkey[8];


printf("请输入8个要加密的字符:\n");
for(i=0;i<8;i++)
scanf("%c",&str[i]);
getchar();
for(i=0;i<8;i++)
strkey[i]=str[i];
printf("\n输入明文的十六进制为:\n");
for(i=0;i<8;i++)
printf("%10x",strkey[i]);
printf("\n请输入密钥(8个字符):\n");
for(i=0;i<8;i++)
scanf("%c",&keychar[i]);
for(i=0;i<8;i++)
key2[i]=keychar[i];
getchar();
// printf("%c",keychar[i]);
Encode(strkey,key2);
printf("\n加密后十六进制密文是:\n");
for(i=0;i<8;i++)
printf("%10x",strkey[i]);
printf("\n\n清输入解密密码\n");
for(i=0;i<8;i++)
scanf("%c",&keychar[i]);
for(i=0;i<8;i++)
key2[i]=keychar[i];
Decode(strkey,key2);
for(i=0;i<8;i++)
printf("%10x",strkey[i]);
for(i=0;i<8;i++)
str[i]=strkey[i];
printf("\n明文为:\t");
for(i=0;i<8;i++)
printf("%c",str[i]);
printf("\n\n");

}


void keyBuild(int *keychar){ //create key array
int i,j;
int movebit[]={1,1,2,2,2,2,2,2,
1,2,2,2,2,2,2,1};
int midkey2[56];
int midkey[64];
StrtoBin(midkey,keychar);
for(i=0;i<56;i++)
midkey2[i]=midkey[PC1[i]-1];
for(i=0;i<16;i++)
keyCreate(midkey2,movebit[i],i);
}
void StrtoBin(int *midkey,int *keychar){ //change into binary
int trans[8],i,j,k,n;
n=0;
for(i=0;i<8;i++){
j=0;
while(keychar[i]!=0){
trans[j]=keychar[i]%2;
keychar[i]=keychar[i]/2;
j++;
}
for(k=j;k<8;k++)trans[k]=0;
for(k=0;k<8;k++)
midkey[n++]=trans[7-k];
}
}
void keyCreate(int *midkey2,int movebit,int n){
int i,temp[4];
temp[0]=midkey2[0];
temp[1]=midkey2[1];
temp[2]=midkey2[28];
temp[3]=midkey2[29];
if(movebit==2){
for(i=0;i<26;i++){
midkey2[i]=midkey2[i+2];
midkey2[i+28]=midkey2[i+30];
}
midkey2[26]=temp[0];midkey2[27]=temp[1];
midkey2[54]=temp[2];midkey2[55]=temp[3]; }
else
{ for(i=0;i<27;i++){
midkey2[i]=midkey2[i+1];
midkey2[i+28]=midkey2[i+29];
}
midkey2[27]=temp[0];midkey2[55]=temp[2];
}
for(i=0;i<48;i++)
key[n][i]=midkey2[PC2[i]-1];
}
void EncodeData(int *lData,int *rData,int *str){ //encodedata function
int i,j,temp[8],lint,rint;//int h;
int data[64];
lint=0,rint=0;
for(i=0;i<4;i++){
j=0;
while(str[i]!=0){
temp[j]=str[i]%2;
str[i]=str[i]/2;
j++;
}
while(j<8)temp[j++]=0;
for(j=0;j<8;j++)
lData[lint++]=temp[7-j];
j=0;
while(str[i+4]!=0){
temp[j]=str[i+4]%2;
str[i+4]=str[i+4]/2;
j++;
}
while(j<8)temp[j++]=0;
for(j=0;j<8;j++)rData[rint++]=temp[7-j];
}
for(i=0;i<32;i++){
data[i]=lData[i];
data[i+32]=rData[i];
}

for(i=0;i<32;i++){
lData[i]=data[IP1[i]-1];//printf("P1:%5d:%5d,%5d\n",IP1[i],lData[i],data[IP1[i]-1]);
rData[i]=data[IP1[i+32]-1];
}
}
void F(int *rData,int *key){ //F function
int i,rDataP[48];
Expand(rData,rDataP);


for(i=0;i<48;i++){
rDataP[i]=rDataP[i]^key[i];// printf("%10d",rDataP[i]);if((i+1)%6==0)printf("\n");
}

ExchangeS(rDataP,rData);

ExchangeP(rData);


}
void Expand(int *rData,int *rDataP){ //Expand function
int i;
for(i=0;i<48;i++)
rDataP[i]=rData[Ex[i]-1];
}
void ExchangeS(int *rDataP,int *rData){ //S-diagram change
int i,n,linex,liney;
linex=liney=0;
for(i=0;i<48;i+=6){
n=i/6; //printf("%10d\n",(rDataP[i]<<1));
linex=(rDataP[i]<<1)+rDataP[i+5];
liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4];

FillBin(rData,n,s[n][linex][liney]);
}
}
void ExchangeP(int *rData){ //P change
int i,temp[32];
for(i=0;i<32;i++)
temp[i]=rData[i];

for(i=0;i<32;i++)
rData[i]=temp[P[i]-1];
}
void FillBin(int *rData,int n,int s){ // data to binary;call by S-Diagram change function
int temp[4],i;
for(i=0;i<4;i++){
temp[i]=s%2;
s=s/2;
}
for(i=0;i<4;i++)
rData[n*4+i]=temp[3-i];
}
void DecodeData(int *str,int *lData,int *rData){ //DecodeData from binary
int i;int a,b;int data[64];
a=0,b=0;
for(i=0;i<32;i++){
data[i]=lData[i];
data[i+32]=rData[i];
}
for(i=0;i<32;i++){
lData[i]=data[IP2[i]-1];
rData[i]=data[IP2[i+32]-1];
}
for(i=0;i<32;i++){
a=(lData[i]&0x1)+(a<<1);
b=(rData[i]&0x1)+(b<<1);
if((i+1)%8==0){
str[i/8]=a;a=0;//printf("%d",i/8);
str[i/8+4]=b;b=0;//printf("%d",i/8+4);
}
}

}

void Encode(int *str,int *keychar){ //encode: input 8 chars,8 keychars
int lData[32],rData[32],temp[32],rDataP[48];
int i,j;
keyBuild(keychar);

EncodeData(lData,rData,str);
for(i=0;i<16;i++){
for(j=0;j<32;j++)
temp[j]=rData[j];
F(rData,key[i]);
for(j=0;j<32;j++){
rData[j]=rData[j]^lData[j];
}

for(j=0;j<32;j++)
lData[j]=temp[j];
}

DecodeData(str,rData,lData);

}
void Decode(int *str,int *keychar){ //decode :input 8 chars,8 keychars
int lData[32],rData[32],temp[32],rDataP[48];
int i,j;
keyBuild(keychar);
EncodeData(lData,rData,str); //这个位置
for(i=0;i<16;i++){
for(j=0;j<32;j++)
temp[j]=rData[j];
F(rData,key[15-i]);
for(j=0;j<32;j++){
rData[j]=rData[j]^lData[j];
}

for(j=0;j<32;j++){
lData[j]=temp[j];
}
}
DecodeData(str,rData,lData);
}
yuhudie203 2009-08-28
  • 打赏
  • 举报
回复
Encode处理之后的字符串是怎么返回的? 函数应该定义为char* 或者CString类型 然后返回这个处理后的字符串

CString.Format("%d",Encode(strkey,key2)); 也一样啊 Encode(strkey,key2)处理后无返回值 所以报错啊
GMingZ 2009-08-28
  • 打赏
  • 举报
回复
你应该将接收密文的字符指针赋给Encode(int *str,int *keychar)形参的吧。
GMingZ 2009-08-28
  • 打赏
  • 举报
回复
你没将Encode的返回值赋给另外一个变量吧?他返回的是void,没有返回值的。函数体里也不能有返回值。
huziwu 2009-08-28
  • 打赏
  • 举报
回复
miwen.Format("%d",Encode(strkey,key2));
肯定有问题,因为Encode的返回值类型为void即无返回值,你是获不到东西的

错误提示 :
CStringT <BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”
是由于Unicode引起的,可以改为:
miwen.Format(_T("%d"),Encode(strkey,key2)); //但获得值还是不对
你可以这样:
Encode(strkey,key2)
miwen.Format(_T("%s"),(TCHAR *)strkey);
或者:
for(int i=0;i<8;i++)//8为你strkey的长度

miwen.Format(miwen+_T(" %d"),strkey[i]);
stjay 2009-08-28
  • 打赏
  • 举报
回复
这个代码只能加密8个字符的明文....
而且代码很乱

还是找别的代码吧

网上有很多优秀的DES库
stjay 2009-08-28
  • 打赏
  • 举报
回复
9楼不是说了么

Encode((int *)mingwen1.GetBuffer(0), (int *)(LPTSTR)miyue);
mingwen1.ReleaseBuffer();
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 stjay 的回复:]
引用 13 楼 live_for_you 的回复:
我改成了:
miwen.Format("%d",Encode(strkey,key2));
结果又出来错误提示
CStringT <BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”


无语...
[/Quote]
怎么无语啦~~~~~说说怎么改嘛
stjay 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 live_for_you 的回复:]
我改成了:
miwen.Format("%d",Encode(strkey,key2));
结果又出来错误提示
CStringT <BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”
[/Quote]

无语...
stjay 2009-08-28
  • 打赏
  • 举报
回复
如使用Unicode方式
一样可以DES加解密
只不过ACSII和Unicode两种方式的同一明文 加密后的密文不同而已

或者可以先将CString转成ASCII,
也即宽字符转多字节字符
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 digimon 的回复:]
引用楼主 live_for_you 的回复:

然后我改成了miwen=CString.Format("%d",Encode(strkey,key2));想转换类型
它又说“CString”: 将此类型用作表达式非法,



Format函数没有返回值,直接调用就能格式化
[/Quote]
我改成了:
miwen.Format("%d",Encode(strkey,key2));
结果又出来错误提示
CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
我使用的是Unicode呀
stjay 2009-08-28
  • 打赏
  • 举报
回复
还有就是注意 工程是否使用Unicode编码
CString的Unicode编码
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 digimon 的回复:]
引用楼主 live_for_you 的回复:

然后我改成了miwen=CString.Format("%d",Encode(strkey,key2));想转换类型
它又说“CString”: 将此类型用作表达式非法,



Format函数没有返回值,直接调用就能格式化
[/Quote]
可以说说具体怎么改吗?
stjay 2009-08-28
  • 打赏
  • 举报
回复
去学习一下CString的用法吧
CString 转成 LPTSTR,再转成其他类型的指针

CString miyue;
CString miwen;
CString miwen1;
CString miyue1;
CString mingwen1;

void Encode(int *str,int *keychar);
没仔细看,一般str是入口出口参数,keychar是入参数

如Encode((int *)mingwen1.GetBuffer(0), (int *)(LPTSTR)miyue);
mingwen1.ReleaseBuffer();
hbprotoss 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 live_for_you 的回复:]

然后我改成了miwen=CString.Format("%d",Encode(strkey,key2));想转换类型
它又说“CString”: 将此类型用作表达式非法,

[/Quote]

Format函数没有返回值,直接调用就能格式化
live_for_you 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feilinhe 的回复:]
void Encode(int *str,int *keychar)
两个参数里面应该有一个是保存加密后的字符串的吧
它的函数的参数没说明吗?
[/Quote]
第一个是明文,第二个是密钥
feilinhe 2009-08-28
  • 打赏
  • 举报
回复
void Encode(int *str,int *keychar)
两个参数里面应该有一个是保存加密后的字符串的吧
它的函数的参数没说明吗?

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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