最近在用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); } }}我的代码因为有高低位转换,所以很繁琐,如果不需要,或者用C++自带的函数应该会很简单。
新闻热点
疑难解答