关于C语言的控制台程序改成mfc,遇到有关问题,

关于C语言的控制台程序改成mfc,遇到问题,求助!
本帖最后由 VisualEleven 于 2014-04-04 11:28:57 编辑
以前写的一个密码算法,有接口,但是现在要改成mfc的形式展示出结果。我是直接将之前那个工程的.C和.H直接加入现在的mfc工程中。然后点击按钮调用那些接口。现在遇到一个问题,我有一个密钥(某种数据结构),想在里面手动的改变为预设的值,但是其都是256位的16进制数。
我预设的值(举例,不都列举了):
char *sm2_param_d_B[2] = {
"1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0",
"56A270D17377AA9A367CFA82E46FA5267713A9B91101D0777B07FCE018C757EB",
};

然后key是随机算的:
key = SM2_KEY_new(param);
if (!SM2_KEY_generate(key))
goto err;

接下来将里面的公钥和私钥的值改为预设:
key->param=param;
BN_hex2bn(&key->privkey, sm2_param_d_B[0]);
BN_hex2bn(&key->pubkey->x, sm2_param_p_B[0]);
BN_hex2bn(&key->pubkey->y, sm2_param_p_B[1]);

关于BN_hex2bn,就是将预设值转换成大数然后存入KEY的私钥和公钥中。但是发现这个过程没有生效,每次密钥都是随机的。
以下是hex2bn的算法:
int BN_hex2bn(BIGNUM **bn, const char *a)
{
BIGNUM *ret=NULL;
BN_ULONG l=0;
int neg=0,h,m,i,j,k,c;
int num;

if ((a == NULL) || (*a == '\0')) return(0);

if (*a == '-') { neg=1; a++; }

for (i=0; isxdigit((unsigned char) a[i]); i++)
;

num=i+neg;
if (bn == NULL) return(num);

/* a is the start of the hex digits, and it is 'i' long */
if (*bn == NULL)
{
if ((ret=BN_new()) == NULL) return(0);
}
else
{
ret= *bn;
BN_zero(ret);
}

/* i is the number of hex digests; */
if (bn_expand(ret,i*4) == NULL) goto err;

j=i; /* least significant 'hex' */
m=0;
h=0;
while (j > 0)
{
m=((BN_BYTES*2) <= j)?(BN_BYTES*2):j;
l=0;
for (;;)
{
c=a[j-m];
if ((c >= '0') && (c <= '9')) k=c-'0';
else if ((c >= 'a') && (c <= 'f')) k=c-'a'+10;
else if ((c >= 'A') && (c <= 'F')) k=c-'A'+10;
else k=0; /* paranoia */
l=(l<<4)|k;

if (--m <= 0)
{
ret->d[h++]=l;
break;
}
}
j-=(BN_BYTES*2);
}
ret->top=h;
bn_correct_top(ret);
ret->neg=neg;

*bn=ret;
bn_check_top(ret);
return(num);
err:
if (*bn == NULL) BN_free(ret);
return(0);
}

int BN_dec2bn(BIGNUM **bn, const char *a)
{
BIGNUM *ret=NULL;
BN_ULONG l=0;
int neg=0,i,j;
int num;

if ((a == NULL) || (*a == '\0')) return(0);
if (*a == '-') { neg=1; a++; }

for (i=0; isdigit((unsigned char) a[i]); i++)
;

num=i+neg;
if (bn == NULL) return(num);

/* a is the start of the digits, and it is 'i' long.
 * We chop it into BN_DEC_NUM digits at a time */
if (*bn == NULL)
{
if ((ret=BN_new()) == NULL) return(0);
}
else
{
ret= *bn;
BN_zero(ret);
}

/* i is the number of digests, a bit of an over expand; */
if (bn_expand(ret,i*4) == NULL) goto err;

j=BN_DEC_NUM-(i%BN_DEC_NUM);
if (j == BN_DEC_NUM) j=0;
l=0;
while (*a)
{
l*=10;
l+= *a-'0';
a++;
if (++j == BN_DEC_NUM)
{
BN_mul_word(ret,BN_DEC_CONV);
BN_add_word(ret,l);
l=0;
j=0;
}
}
ret->neg=neg;

bn_correct_top(ret);
*bn=ret;
bn_check_top(ret);
return(num);
err:
if (*bn == NULL) BN_free(ret);
return(0);
}

我感觉是c语言里面用的ascii而mfc用的unicode?所以导致这个算法没有用?可以教教我怎么修改吗?毕设。
------解决方案--------------------
可以先把工程设置为多字节编译运新,看看结果是否对,
函数中设置一个断点单步调试,看看程序是否是按自己的逻辑思路走的,有问题修改之
------解决方案--------------------
引用:
Quote: 引用:

“c语言里面用的ascii而mfc用的unicode?所以导致这个算法没有用?可以教教我怎么修改吗”, 你传进的参数 const char *a,那就跟unicode无关,建议手动一步一步的调试,应该很容易看到问题所在 

谢谢你的回答,我想问一下,对于我预设的值,在mfc里面也是按照ascii来存吗,我是判断ascii的值来将char *sm2_param_d_B[2] = {
"1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0",
"56A270D17377AA9A367CFA82E46FA5267713A9B91101D0777B07FCE018C757EB",
};
转换成大数的。
我再控制台里运用,很正常,到了mfc里面,发现这个函数没有起到效果。


引用:
Quote: 引用:

“c语言里面用的ascii而mfc用的unicode?所以导致这个算法没有用?可以教教我怎么修改吗”, 你传进的参数 const char *a,那就跟unicode无关,建议手动一步一步的调试,应该很容易看到问题所在