函数参数 作为返回值 问题

marick 2010-03-08 11:57:29
以下函数有点不太明白 没这样用过 请教
INT32 encrypt(UINT8 *Src,UINT32 SrcLen,UINT8 *Dst,UINT32 *Dst_Len,UINT8 *Key,UINT8 Encryt_Mode)
{
UINT32 a,b;
a=TASK_CMD_ENCRYPT_ID;
b=ENCRYPT_HANDLE_SIG;

af.Par1=Src;
af.Par2=&SrcLen;
af.Par3 =Dst;
af.Par4 =Dst_Len;
af.Par5=Key;
af.Par6=&Encryt_Mode;
return(APP_all_use(&a, &b));
}
参数1为源数据,2为源数据长度
3为加密结果指针 4为加密结果长度指针 //?可以这样描述否
5为密钥 6为加密模式(DES 3DES等(flag))

问题 参数3 和4 未加密之前 我如何传值,传空的指针>? 我现在调用这个函数之后 结果返回0(失败)和1(成功)
我判断成功之后 如何拿到加密后数据 即 如何接收加密结果?
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2010-03-09
  • 打赏
  • 举报
回复
当然不能传空的指针。
比如:
UINT8 dest[1024];
UINT32 dest_len = 1024;
encrypt(src, srclen, dest, &dest_len, key, mode);
执行成功后,dest中含有加密后的数据,dest_len此时就应该变成dest中所装有的密文的实际长度了。
一开始你传进去的时候,它表示dest缓冲区的最大长度,用于防止溢出。所以Dst_Len即是个输入参数,又是个输出参数。
w0911h 2010-03-09
  • 打赏
  • 举报
回复
不能为空指针,必须是你先分配好空间,再将分配的空间指针传进去
james_hw 2010-03-09
  • 打赏
  • 举报
回复
引用楼主 marick 的回复:
以下函数有点不太明白 没这样用过 请教
INT32 encrypt(UINT8 *Src,UINT32 SrcLen,UINT8 *Dst,UINT32 *Dst_Len,UINT8 *Key,UINT8 Encryt_Mode)
{
UINT32 a,b;
a=TASK_CMD_ENCRYPT_ID;
b=ENCRYPT_HANDLE_SIG;

af.Par1=Src;
af.Par2=&SrcLen;
af.Par3 =Dst;
af.Par4 =Dst_Len;
af.Par5=Key;
af.Par6=&Encryt_Mode;
return(APP_all_use(&a, &b));
}
参数1为源数据,2为源数据长度
3为加密结果指针 4为加密结果长度指针 //?可以这样描述否
5为密钥    6为加密模式(DES 3DES等(flag))

问题 参数3 和4 未加密之前 我如何传值,传空的指针>? 我现在调用这个函数之后 结果返回0(失败)和1(成功)
我判断成功之后 如何拿到加密后数据 即 如何接收加密结果?


加密后的数据缓冲区是不能为空的,一般你得分配好空间,然后再调用,例如
#define MAX_DEC_SIZE 1024
BYTE decbuf[MAX_DEC_SIZE];
encrypt(src,srclen,decbuf,&len,&key,&mode);
pengzhixi 2010-03-09
  • 打赏
  • 举报
回复
LZ要记住一条,任何指针在使用之前请先初始化。否则你指针指向的地址是不能确定的,有可能指向的地址不能访问。这样就会遇到麻烦
huanmie_09 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 steedhorse 的回复:
当然不能传空的指针。
比如:
UINT8 dest[1024];
UINT32 dest_len = 1024;
encrypt(src, srclen, dest, &dest_len, key, mode);
执行成功后,dest中含有加密后的数据,dest_len此时就应该变成dest中所装有的密文的实际长度了。
一开始你传进去的时候,它表示dest缓冲区的最大长度,用于防止溢出。所以Dst_Len即是个输入参数,又是个输出参数。

UP
野男孩 2010-03-09
  • 打赏
  • 举报
回复
INT32 encrypt(UINT8 *Src,UINT32 SrcLen,UINT8 *Dst,UINT32 *Dst_Len,UINT8 *Key,UINT8 Encryt_Mode)

依赖于其实现,有可能有不同的调用方式。

比如不知道加密后的数据长度,有可能的实现是Dst参数传入NULL,Dst_Len不为空,值随便。encrypt函数发现Dst为空时,在Dst_Len中返回加密后的长度,然后你就可以根据返回的长度先new一个Dst出来,然后再传入这些参数,Dst就用new出来的地址。
UINT32 DstBufLen = 0;
INT32 ret = encrypt(Src, SrcLen, NULL, &DstBufLen, Key, Encryt_Mode);
UINT8* pDstBuf = new UINT8[DstBufLen];
INT32 ret = encrypt(Src,SrcLen,pDstBuf, &DstBufLen,Key,Encryt_Mode);



或者事先就分配足够长的空间给Dst,那就直接调用就好了。
UINT8 pDstBuf[1024] = {0};
UINT32 DstBufLen = sizeof(pDstBuf);
INT32 ret = encrypt(Src,SrcLen,pDstBuf, &DstBufLen,Key,Encryt_Mode);

encrypt加密成功返回后,pDstBuf里面就是加密后的数据,DstBufLen就是加密后的实际长度
marick 2010-03-09
  • 打赏
  • 举报
回复
还有个那么晚才睡觉的兄弟,不会是加班吧!太辛苦了 谢谢你们的热心回答
marick 2010-03-09
  • 打赏
  • 举报
回复
谢谢各位,明白了!结贴了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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