之前做单片机没做加密,也没人抄,好不容易做了个比较火的产品,被15年带的徒弟上位机加板子给抄袭了,板子、钣金几乎抄的一模一样,上位机也直接抓包写了单片机程序,上位机拿着直接用了,我从公司出来做产品升级了自己卖,这次想到要做好加密,于是上了md5 aes rsa ,发现hex转str这个东西找了半小时没找到特别好用的,就写了个记录下
/*******************************************************************************
* file Name ? : tools.c
* Description ? ?: 工具组部分代码
* author : perfectlala
* wechat : nidejishuguwen
*******************************************************************************/
#include "tools.h"?
#include <string.h>?
/*******************************************************************************
* Function Name ?: HexToAscii
* Description ? ?: 16进制转字符串?
* Input ? ? ? ? ?: uint8_t *pHex?? ??? ??? ?-- 十六进制数组
*?? ??? ??? ??? ?:uint8_t *pAscii ?? ??? ?-- 字符串数组
* Output ? ? ? ? : None
* Return ? ? ? ? : None
*******************************************************************************/
void HexToAscii(uint8_t *pHex, uint8_t *pAscii, int nLen) {
? ? uint8_t Nibble[2];
? ? for (int i = 0; i < nLen; i++) {
? ? ? ? Nibble[0] = (pHex[i] & 0xF0) >> 4;
? ? ? ? Nibble[1] = pHex[i] & 0x0F;
? ? ? ? for (int j = 0; j < 2; j++) {
? ? ? ? ? ? if (Nibble[j] < 10) {
? ? ? ? ? ? ? ? Nibble[j] += 0x30;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? if (Nibble[j] < 16) {
? ? ? ? ? ? ? ? ? ? // Nibble[j] = Nibble[j] - 10 + 'A';
? ? ? ? ? ? ? ? ? ? Nibble[j] = Nibble[j] - 10 + 'a';
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? *pAscii++ = Nibble[j];
? ? ? ? }
? ? }
? ? *pAscii++ = '\0';
}
?
/*******************************************************************************
* Function Name ?: StrToHex
* Description ? ?: 字符串转16进制?
* Input ? ? ? ? ?: uint8_t *pAscii?? ?-- 字符串数组
*?? ??? ??? ??? ?:uint8_t *pHex ?? ??? ?-- 十六进制数组
* Output ? ? ? ? : None
* Return ? ? ? ? : Int 0 成功
*******************************************************************************/
int StrToHex(uint8_t *pAscii, uint8_t *pHex){
?? ?uint8_t Nibble[2];
?? ?uint8_t temp;
?? ?int nLen = strlen((char*)pAscii);?? ??? ?
?? ?if(nLen%2 != 0){//不合法的16进制?
?? ?? ?return 1;
?? ?}
? ? for (int i = 0; i < nLen; i++) {?? ??? ??? ?
?? ? ?temp=0;
?? ?? ?redo:
?? ??? if(pAscii[i]>=0x30&&pAscii[i]<=0x39){//如果是0~9
?? ??? ???temp |= ((pAscii[i] - 0x30))<<(i%2==0?4:0);
?? ??? }else if(pAscii[i]>=0x41&&pAscii[i]<=0x46){//如果是A~F
?? ??? ???temp |=(pAscii[i] - 0x37)<<(i%2==0?4:0);
?? ??? }else if(pAscii[i]>=0x62&&pAscii[i]<=0x66){//如果是a~f
?? ??? ?? temp |= (pAscii[i] - 0x58)<<(i%2==0?4:0);
?? ??? }?
?? ??? if(i%2==0){
?? ??? ???i++;
?? ??? ???goto redo;
?? ??? }
?? ??? pHex[i/2] = temp;?
? ? }
?? return 0;
}
/*******************************************************************************
* file Name ? : testhex.c
* Description ? ?: 转码测试测试
* author : perfectlala
* wechat : nidejishuguwen
*******************************************************************************/
#include "rsa.h"
#include "tools.h"
#include <stdio.h>
#include <string.h>
int main(void)
{
const char *p="AB3355669988771232FF";
char buf[100];
char buf2[100];
int len = strlen(p),i;
printf("**************************testhex******************\r\n",p);
printf("StrToHex\r\nstrhex:%s\r\n",p);
if(StrToHex(p,buf)==0){
printf("hexbin:");
for(i=0;i<len/2;i++){
printf("%02X ",buf[i]&0xff);
}
printf("\r\n");
}else{
printf("StrToHex fail hexstrlen:%d\%2=%d",len,len%2);
}
HexToAscii(buf,buf2,len/2);
printf("hextostr\r\nstrhex:%s\r\n",buf2);
return 0;
}
make testhex
**************************testhex******************
StrToHex
strhex:AB3355669988771232FF
hexbin:AB 33 55 66 99 88 77 12 32 FF
hextostr
strhex:ab3355669988771232ff
|