概述
最近在用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'*/>55){//负数,修改,最高位大于7为负数
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++自带的函数应该会很简单。
最后
以上就是幸福酒窝为你收集整理的字符串形式的十六进制与十进制互相转换的全部内容,希望文章能够帮你解决字符串形式的十六进制与十进制互相转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复