首页 > 学院 > 开发设计 > 正文

字符串形式的十六进制与十进制互相转换

2019-11-08 01:12:52
字体:
来源:转载
供稿:网友

最近在用mewtocol协议与松下PLC通信,需要将收到的字符串形式的有符号十六进制数字转换成十进制,比如”0000F824”转换成63524,以及将输入的十进制转换成有符号的十六进制字符串。我不是系统学软件的,很多基本函数不知道怎么用,网上找了很多方法都解决不了,最后自己弄了个笨办法。

十六进制转换成十进制

步骤分为三步:

将十六进制字符串放入字符数组里;将字符数组转换成对应的整形数组;

使用十六进制与十进制的转换计算方法计算得出十进制值;

因为与PLC通信时十六进制的高低位不同,所以代码里有高低位互换,具体代码如下:

void CMainFrame::HexToDeci(CString hex,double &deci){ int len=strlen(hex); char code[8]; //我的只需要八位就可以 int i_code[8]; deci=0; for (int i=0;i<len;i++){ code[i]=hex[len-1-(i+1)]; //高低位互换 code[i+1]=hex[len-1-i]; switch(code[i]){ case 'A': i_code[i]=0x0A; break; case 'B': i_code[i]=0x0B; break; case 'C': i_code[i]=0x0C; break; case 'D': i_code[i]=0x0D; break; case 'E': i_code[i]=0x0E; break; case 'F': i_code[i]=0x0F; break; default: i_code[i]=toascii(code[i])-0x30; break; } switch(code[i+1]){ case 'A': i_code[i+1]=0x0A; break; case 'B': i_code[i+1]=0x0B; break; case 'C': i_code[i+1]=0x0C; break; case 'D': i_code[i+1]=0x0D; break; case 'E': i_code[i+1]=0x0E; break; case 'F': i_code[i+1]=0x0F; break; default: i_code[i+1]=toascii(code[i+1])-0x30; break; } i++; } if(code[0]=='F'){ //负数 for (int i=0;i<len;i++){ if(i_code[len-1-i]!=0){ i_code[len-1-i]-=1; if (i!=0) i_code[len-i]=0x0F; break; } } for (int i=0;i<len;i++){ i_code[i]=i_code[i]^0x0F; } for (int i=0;i<len;i++){ deci+=i_code[i]*pow(16.0,len-1-i); } deci=-deci; } else{ for (int i=0;i<len;i++){ deci+=i_code[i]*pow(16.0,len-1-i); } }}

十进制转换为十六进制

void CmainFrame::DeciToHexStringCode(int deci,CString &HexCode){ CString str; char code[8]; int i_code[8]; str.Format("%X",abs(deci)); int len=strlen(str); for(int i=0;i<(8-len);i++){ str="0"+str; } if (deci>0){ for (int i=0;i<8;i++) { code[i]=str[7-(i+1)]; code[i+1]=str[7-i]; HexCode=HexCode+code[i]+code[i+1]; i++; } } else{ for (int i=0;i<8;i++){ code[i]=str[i]; switch(code[i]){ case 'A': i_code[i]=0x0A; break; case 'B': i_code[i]=0x0B; break; case 'C': i_code[i]=0x0C; break; case 'D': i_code[i]=0x0D; break; case 'E': i_code[i]=0x0E; break; case 'F': i_code[i]=0x0F; break; default: i_code[i]=toascii(code[i])-0x30; break; } i_code[i]=i_code[i]^0x0F; } for (int i=0;i<8;i++) //负数的补码等于其正数的二进制加1取反 if (i_code[7-i]!=15){ i_code[7-i]=i_code[7-i]+1; break; } else i_code[7-i]=0; } CString trans="",str2=""; for (int i=0;i<8;i++){ str2.Format("%X",i_code[i]); trans+=str2; } for (int i=0;i<8;i++){ code[i]=trans[7-(i+1)]; code[i+1]=trans[7-i]; HexCode=HexCode+code[i]+code[i+1]; i++; } }}

我的代码因为有高低位转换,所以很繁琐,如果不需要,或者用C++自带的函数应该会很简单。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表