字符串转BCD码函数
函数:实现字符串转换成BCD码,例如 A1B2C367转换完后 0xA1 0xB2 0xC7 0x67我写了下面的函数,调试之后不能达到想要的结果,请教一下大侠我的思路有没有问题。
void CharToBcd(char * Cbuf, BYTE * Bbuf,short *blen)
{
short i,j;
short tem_len;
tem_len = strlen(Cbuf);
for(i = 0;i < tem_len;i++)
{
switch(Cbuf)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
Cbuf = ((Cbuf-0x30)&0x0f);
break;
case 'A':
case 'a':
Cbuf = 0x0A;
break;
case 'B':
case 'b':
Cbuf = 0x0B;
break;
case 'C':
case 'c':
Cbuf = 0x0C;
break;
case 'D':
case 'd':
Cbuf = 0x0D;
break;
case 'E':
case 'e':
Cbuf = 0x0E;
break;
case 'F':
case 'f':
Cbuf = 0x0F;
break;
}
}
if((tem_len % 2) == 0)
{
for(i = 0 ,j =0; i < tem_len;i++,j++)
{
Bbuf = (BYTE)((Cbuf<<4)&0xf0)||(Cbuf&0x0f);
}
*blen = (tem_len/2);
}
else
{
if(tem_len == 1)
{
Bbuf = (BYTE)(Cbuf&0x0f);
*blen = tem_len;
}
else
{
for(i = 0 ,j =0; i < tem_len-1;i++,j++)
{
Bbuf = (BYTE)((Cbuf<<4)&0xf0)||(Cbuf&0x0f);
}
Bbuf = (BYTE)(Cbuf&0x0f);
*blen = (tem_len/2)+1;
}
}
} 调试通过,望拍砖!!!
void CharToBcd(char * Cbuf, BYTE * Bbuf,short *blen)
{
short i,j;
short tem_len;
BYTE tem_h;
BYTE tem_l;
tem_len = strlen(Cbuf);
for(i = 0;i < tem_len;i++)
{
switch(Cbuf)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
Cbuf = ((Cbuf-0x30)&0x0f);
break;
case 'A':
case 'a':
Cbuf = 0x0A;
break;
case 'B':
case 'b':
Cbuf = 0x0B;
break;
case 'C':
case 'c':
Cbuf = 0x0C;
break;
case 'D':
case 'd':
Cbuf = 0x0D;
break;
case 'E':
case 'e':
Cbuf = 0x0E;
break;
case 'F':
case 'f':
Cbuf = 0x0F;
break;
}
}
if((tem_len % 2) == 0)
{
for(i = 0 ,j =0; i < tem_len;i++,j++)
{
tem_h = (BYTE)(Cbuf<<4)&0xf0 ;
tem_l = (BYTE)(Cbuf[++i]&0x0f);
Bbuf = tem_h |tem_l;
}
*blen = (tem_len/2);
}
else
{
if(tem_len == 1)
{
Bbuf = (BYTE)(Cbuf&0x0f);
*blen = tem_len;
}
else
{
for(i = 0 ,j =0; i < tem_len-1;i++,j++)
{
tem_h = (BYTE)(Cbuf<<4)&0xf0 ;
tem_l = (BYTE)(Cbuf[++i]&0x0f);
Bbuf = tem_h |tem_l;
}
Bbuf = (BYTE)(Cbuf&0x0f);
*blen = (tem_len/2)+1;
}
}
} 好象有点繁复 atoi() atol()... 原理都一样,就看自己怎么实现了。赞一下楼主。我自己也写过类似的转换函数。
我比较奇怪的是,为什么有的协议非要用ASCII传送,报文是0x12 0xA3 0x7E,发送时非要转换成“12A37E”再传送。这是出于什么目的?仅仅是为了观察报文时直观么? 3楼兄弟所说,对数据变换有用,但对一个完整的协议帧,就有问题了。 观察报文直观了,处理起来却麻烦了,明显得不偿失。我个人认为,不知道有哪位朋友可以解释一下如此的目的? 看看 我用到比较多的是在 串口通信过程中,数据进来的是字符串,要把他转换成BCD码发送给串口设备! '------------------2位16进制字符串转8位2进制字符串 向下位机发送 -----------------------------
Public Function HexStrToStr(strHex As String) As String "FF"--->"1111 1111"
Dim i As Integer
Dim strBin As Integer
HexStrToStr = ""
For i = 1 To Len(strHex) Step 2
If i + 1 > Len(strHex) Then
strBin = "&H" & "0" & Mid$(strHex, i, 2)
Else
strBin = "&H" & Mid$(strHex, i, 2)
End If
Next
HexStrToStr = CByte(strBin)
End Function
'接收下位机发送的数据并转换成16进制可显示字符
Public Function StrToHexStr(strBin As String) As String
Dim i As Integer
Dim strHex As String
StrToHexStr = ""
For i = 1 To Len(strBin) Step 2
If i = 1 Then
strHex = Right("0" & Hex$(Asc(Mid$(strBin, i, 2))), 2)
Else
strHex = Right((strHex & Hex$(Asc(Mid$(strBin, i, 2)))), 2)
End If
Next
StrToHexStr = strHex
End Function
'---------------------------------------------------------------------------------------------------------------------
大家看看能修改的更快更稳定吗?并把里面的bug修改了. 有点烦了 楼上的兄弟有简单的方法么? MARK
页:
[1]