由于程序中有用到MD5加密,里面运算有用到sprintf 函数。
之前在STM32平台上一直正常运行,怎么在CC2640R2F上就不行?
这是CC2640R2F的定义
char* hmac_md5(char* text,char* key,int text_len){ char digest[16]; char output1[32];
static char output[33]={""}; MD5_CTX context; unsigned char k_ipad[65]; /* inner padding – * key XORd with ipad */ unsigned char k_opad[65]; /* outer padding – * key XORd with opad */ unsigned char tk[16]; int i; //int text_len = strlen (text); int key_len=strlen(key); /* if key is longer than 64 bytes reset it to key=MD5(key) */ if (key_len > 64) { MD5_CTX tctx; MD5Init(&tctx); MD5Update(&tctx,(unsigned char*) key, key_len); MD5Final(tk, &tctx); key = (char*)tk; key_len = 16; } /* * the HMAC_MD5 transform looks like: * * MD5(K XOR opad, MD5(K XOR ipad, text)) * * where K is an n byte key * ipad is the byte 0x36 repeated 64 times * opad is the byte 0x5c repeated 64 times * and text is the data being protected */ /* start out by storing key in pads */ /*bzero( k_ipad, sizeof k_ipad); bzero( k_opad, sizeof k_opad); */ for(i=0;i<65;i++) k_ipad[i]=(unsigned char)0; for(i=0;i<65;i++) k_opad[i]=(unsigned char)0; /*bcopy( key, k_ipad, key_len); bcopy( key, k_opad, key_len); */ for(i=0;i<key_len;i++) {k_ipad[i]=(unsigned char)key[i]; k_opad[i]=(unsigned char)key[i]; } /* XOR key with ipad and opad values */ for (i=0; i<64; i++) { k_ipad[i] ^= 0x36; k_opad[i] ^= 0x5c; } /* * perform inner MD5 */ MD5Init(&context); /* init context for 1st * pass */ MD5Update(&context, k_ipad, 64); /* start with inner pad */ MD5Update(&context, (unsigned char*)text, text_len); /* then text of datagram*/ MD5Final((unsigned char*)digest, &context); /* finish up 1st pass */ /* * perform outer MD5 */ MD5Init(&context); /* init context for 2nd * pass */ MD5Update(&context, k_opad, 64); /* start with outer pad */ MD5Update(&context,(unsigned char*) digest, 16); /* then results of 1st * hash */ MD5Final((unsigned char*)digest, &context); /* finish up 2nd pass */ for (i = 0; i < 16; i++) {
sprintf(&(output1[2*i]),"%02x",(unsigned char)digest[i]);
sprintf(&(output1[2*i+1]),"%02x",(unsigned char)(digest[i]<<4));
} for(i=0;i<32;i++) output[i]=output1[i]; return output;}
执行到这里就不走了。
也看到之前的一些关于这个sprintf的问题,是不是库的一个bug啊。
各位大神,帮我看看这个问题!谢谢!
Susan Yang:
您有没有用–printf_support=full?
The compiler option –printf_support=[full | minimal | nofloat] allows you to use a smaller, feature limited, variant of printf/sprintf, and make that choice at build time.
The valid values are:
full: Supports all format specifiers. This is the default.
nofloat: Excludes support for printing floating point values. Supports all format specifiers except %f, %g, %G, %e, and %E.
minimal: Supports the printing of integer, char, or string values without width or precision flags. Specifically, only the %%, %d, %o, %c, %s, and %x format specifiers are supported更多信息您可以参考
processors.wiki.ti.com/…/Printf_support_in_compiler
processors.wiki.ti.com/…/Tips_for_using_printf
Viki Shi:
论坛有类似问题,请参考这边解答: e2e.ti.com/…/669031
user4826221:
回复 Susan Yang:
你好,谢谢你的回复!
但是这个默认就是FULL的。
如果改minimal都编译不过的。
能再帮我看看可能是其他什么问题么?
Susan Yang:
回复 user4826221:
请您看一下 Stack Size 以及 Heap Size
您可以按照下面的链接进行设置,希望对您有所帮助!
processors.wiki.ti.com/…/Tips_for_using_printf
For projects not using DSP/BIOS: Under Project -> Properties -> Build -> Linker -> Basic Options -> Heap Size(-heap) enter the heap size, e.g. 0x400
user4826221:
回复 Susan Yang:
谢谢你的回复,TI的效率就是牛!
但是我从其他帖子中也看到过这个更改Heap Size的回答。也用过了。使用sprintf还是有问题。
刚刚发现个奇怪的现象:以下为DEBUG模式下的截图,用的CCS v8.0。
执行了sprintf后,程序中另外的一些数据被写为奇怪的数值。
执行前
执行后
只要把这个sprintf注释掉,就没有问题。
希望再帮忙看看这个问题!!
Susan Yang:
回复 user4826221:
请您确认下 Project->Properties->Debug 是否在 Enable CIO function use. 前面打勾
另外请您使用 "View" -> "Console" 试一下
Per default the standard output of printf() function is the debug console on the CCSTUDIO. Therefore before starting debugging the code, it is necessary to make sure the debug console of the project is activated (Select "View" -> "Console").
user4826221:
回复 Susan Yang:
谢谢您的回复,但是调试的时候,肯定我是会确保当前代码就是正在调试的代码。
还是希望您再帮我看看,为啥一执行就有一部分的变量被乱赋值,刚刚试过在程序开始的地方中调用,还是这样有段变量被改变,只是地址换了。