为了账号安全,请及时绑定邮箱和手机立即绑定

有谁能把memcpy函数详细的讲解一下呢?请问该怎么修改才正确?

有谁能把memcpy函数详细的讲解一下呢?请问该怎么修改才正确?

千万里不及你 2022-03-19 15:11:31
extern void DES_EncryptBlock(char plainBlock[8],int subkeys[16][48],char cipherBlock[8]){int plainbit[64]={0};int copyright[48]={0};int cnt;Char8tobit64(plainBlock,plainbit);IP_transform(plainbit);//16轮迭代for(cnt=0;cnt<16;cnt++){memcpy(copyright,plainbit+32,32);E_transform(copyright);DES_OR(copyright,subkeys[cnt],48);DES_SBOX(copyright);P_transform(copyright);DES_OR(plainbit,copyright,32);if(cnt!=15){swap(plainbit,plainbit+32);}IP_1_transform(plainbit);Bit64tochar8(plainbit,cipherBlock);}}这是DES加密的程序,但是memcpy那语句出错,32个数据没拷贝进去
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

void *memcpy(void *dest, const void *src, size_t n);
由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内。
一般的,在32位编译环境中,sizeof(int)=4。
所以你的第三个参数32肯定是不对的

查看完整回答
反对 回复 2022-03-23
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

extern void DES_EncryptBlock(char plainBlock[8],int subkeys[16][48],char cipherBlock[8])
{
int plainbit[64]={0};
int copyright[48]={0};

int cnt;
Char8tobit64(plainBlock,plainbit);
IP_transform(plainbit);
//16轮迭代
for(cnt=0;cnt<16;cnt++)
{

memcpy(copyright,plainbit+32,32*sizeof(int));
E_transform(copyright);
DES_OR(copyright,subkeys[cnt],48);
DES_SBOX(copyright);
P_transform(copyright);
DES_OR(plainbit,copyright,32);
if(cnt!=15)
{
swap(plainbit,plainbit+32);

}

IP_1_transform(plainbit);
Bit64tochar8(plainbit,cipherBlock);

}

memcpy(copyright,plainbit+32,32*sizeof(int));int copyright[48]={0};
因为最后的长度是32*sizeof(int)不是32



查看完整回答
反对 回复 2022-03-23
  • 2 回答
  • 0 关注
  • 309 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号