搜索
bottom↓
回复: 12

字符串转BCD码函数

[复制链接]

出0入0汤圆

发表于 2009-7-7 15:07:39 | 显示全部楼层 |阅读模式
函数:实现字符串转换成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[j] = (BYTE)((Cbuf<<4)&0xf0)||(Cbuf[i++]&0x0f);
      }
      *blen = (tem_len/2);
   }
   else
   {
     if(tem_len == 1)
     {
          Bbuf[j] = (BYTE)(Cbuf[tem_len]&0x0f);
          *blen = tem_len;
     }
     else
     {
        for(i = 0 ,j =0; i < tem_len-1;i++,j++)
        {
            Bbuf[j] = (BYTE)((Cbuf<<4)&0xf0)||(Cbuf[i++]&0x0f);
        }
        Bbuf[j] = (BYTE)(Cbuf[tem_len]&0x0f);
        *blen = (tem_len/2)+1;
     }
   }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-7-7 16:19:45 | 显示全部楼层
调试通过,望拍砖!!!

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[j] = tem_h |  tem_l;
      }
      *blen = (tem_len/2);
   }
   else
   {
     if(tem_len == 1)
     {
          Bbuf[0] = (BYTE)(Cbuf[tem_len-1]&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[j] = tem_h |  tem_l;
        }
        Bbuf[tem_len/2] = (BYTE)(Cbuf[tem_len-1]&0x0f);
        *blen = (tem_len/2)+1;
     }
   }

}

出0入0汤圆

发表于 2009-7-7 17:16:02 | 显示全部楼层
好象有点繁复

出0入0汤圆

发表于 2009-7-7 17:20:14 | 显示全部楼层
atoi() atol()...

出0入0汤圆

发表于 2009-7-7 17:32:12 | 显示全部楼层
原理都一样,就看自己怎么实现了。赞一下楼主。我自己也写过类似的转换函数。

我比较奇怪的是,为什么有的协议非要用ASCII传送,报文是0x12 0xA3 0x7E,发送时非要转换成“12A37E”再传送。这是出于什么目的?仅仅是为了观察报文时直观么?

出0入0汤圆

发表于 2009-7-7 17:34:24 | 显示全部楼层
3楼兄弟所说,对数据变换有用,但对一个完整的协议帧,就有问题了。

出0入0汤圆

发表于 2009-7-7 17:35:58 | 显示全部楼层
观察报文直观了,处理起来却麻烦了,明显得不偿失。我个人认为,不知道有哪位朋友可以解释一下如此的目的?

出0入0汤圆

发表于 2009-7-7 23:04:56 | 显示全部楼层
看看

出0入0汤圆

 楼主| 发表于 2009-7-8 08:40:28 | 显示全部楼层
我用到比较多的是在 串口通信过程中,数据进来的是字符串,要把他转换成BCD码发送给串口设备!

出0入0汤圆

发表于 2009-7-19 18:12:51 | 显示全部楼层
'------------------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修改了.

出0入0汤圆

发表于 2009-7-19 19:05:22 | 显示全部楼层
有点烦了

出0入0汤圆

发表于 2009-9-8 17:32:38 | 显示全部楼层
楼上的兄弟有简单的方法么?

出0入0汤圆

发表于 2010-6-8 10:43:09 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表