bcd_asc
2017-11-08 23:26:20 yongwoozzang 阅读数 90
long_bcd
             long_asc
             long_tab
             bcd_long
             hex_asc
             bcd_asc
             asc_bcd
             asc_hex

             asc_long


已开发,请qq联系我741442669

2011-07-14 10:05:44 kingsollyu 阅读数 4884

int ASC2BCD(const char* szASC,byte* szBDC)
{
	int szASCLen=strlen(szASC);
	byte * bpBCD = new byte[szASCLen/2];
	int nss=0,nOu=0;
	for (int x=szASCLen-1;x>=0;x--)
	{
		//取出字符串中的一个数值
		char char_1=*(szASC+x);
		//取出BCD码
		int nBDC;
		if (char_1 != '.')		nBDC=(char_1 & 0xF);
		else					nBDC=14;
		
		if ((++nOu)&0x01)
			bpBCD[nss]=(nBDC << 4);
		else
			bpBCD[nss++] += nBDC;
		
	}
	int nBit=0;
	if (nOu%2==0)	nBit=nOu/2-1;
	else			nBit=nOu/2;
	for (int y=0;y<=nOu/2;y++)
	{
		szBDC[y]=(bpBCD[nBit-y] << 4);
		szBDC[y]+=(bpBCD[nBit-y] >> 4);
	}
	return nBit;

//	memcpy(szBDC,bpBCD,sizeof(bpBCD)*2);
}

void CDotTestDlg::OnButton1() 
{
	char szTest[]={"123456789123456789.789"} ;
	
	int s=strlen(szTest);

	byte * szAn=new byte[s/2];
	int w=ASC2BCD(szTest,szAn);
	for(int x=0;x<=w;)
		TRACE("%x ",szAn[x++]);
}


事例:
输出:12 34 56 78 91 23 45 67 89 e7 89
2018-07-03 17:35:00 weixin_30710457 阅读数 12

 

  1. int ASC2BCD(const char* szASC,byte* szBDC)
  2.  
    {
  3.  
    int szASCLen=strlen(szASC);
  4.  
    byte * bpBCD = new byte[szASCLen/2];
  5.  
    int nss=0,nOu=0;
  6.  
    for (int x=szASCLen-1;x>=0;x--)
  7.  
    {
  8.  
    //取出字符串中的一个数值
  9.  
    char char_1=*(szASC+x);
  10.  
    //取出BCD码
  11.  
    int nBDC;
  12.  
    if (char_1 != '.') nBDC=(char_1 & 0xF);
  13.  
    else nBDC=14;
  14.  
     
  15.  
    if ((++nOu)&0x01)
  16.  
    bpBCD[nss]=(nBDC << 4);
  17.  
    else
  18.  
    bpBCD[nss++] += nBDC;
  19.  
     
  20.  
    }
  21.  
    int nBit=0;
  22.  
    if (nOu%2==0) nBit=nOu/2-1;
  23.  
    else nBit=nOu/2;
  24.  
    for (int y=0;y<=nOu/2;y++)
  25.  
    {
  26.  
    szBDC[y]=(bpBCD[nBit-y] << 4);
  27.  
    szBDC[y]+=(bpBCD[nBit-y] >> 4);
  28.  
    }
  29.  
    return nBit;
  30.  
     
  31.  
    // memcpy(szBDC,bpBCD,sizeof(bpBCD)*2);
  32.  
    }

 

  1.  
    void CDotTestDlg::OnButton1()
  2.  
    {
  3.  
    char szTest[]={"123456789123456789.789"} ;
  4.  
     
  5.  
    int s=strlen(szTest);
  6.  
     
  7.  
    byte * szAn=new byte[s/2];
  8.  
    int w=ASC2BCD(szTest,szAn);
  9.  
    for(int x=0;x<=w;)
  10.  
    TRACE("%x ",szAn[x++]);
  11.  
    }



事例:
输出:12 34 56 78 91 23 45 67 89 e7 89

转载于:https://www.cnblogs.com/Pond-ZZC/p/9259769.html

2006-04-28 09:45:00 xpzhang 阅读数 13183

BCD和ASCII相互转化及BCD转int的函数,重新写的,感觉还不错。

可以根据自己的需要更改返回值。

/**********************stdfunc.h***********************/

#ifndef _STD_FUNC_H_
#define _STD_FUNC_H_

/*
参数
bcd: 转化后BCD结果
asc: 需转化ASC字符串
len: 需转化长度
fmt: 转化后的格式,即长度为奇数时,前补还是后补零
返回值
处理的BCD字节长度
*/
int ASC2BCD(unsigned char *bcd, const char *asc, int len, int fmt);

/*
参数
asc: 转化后ASC结果
bcd: 需转化BCD字符串
len: 需转化长度
fmt: 需转化BCD的格式,即长度为奇数时,前补还是后补零
返回值
处理的BCD字节长度
*/
int BCD2ASC(char *asc, const unsigned char *bcd, int len, int fmt);

/*
参数
plen: 转化后int结果指针
bcd: 需转化BCD字符串
len: 需转化长度
fmt: 需转化BCD的格式,即长度为奇数时,前补还是后补零
返回值
处理的BCD字节长度
*/
int BCD2INT(int *plen, const unsigned char *bcd, int len, int fmt);


#endif /* _STD_FUNC_H_ */

/**********************stdfunc.c***********************/

#include "stdfunc.h"


int ASC2BCD (unsigned char *bcd, const char *asc, int len, int fmt)
{
 int i, odd;
 char c;
 
 odd = len&0x01;
 
 if ( odd && !fmt)
  *bcd++ = (*asc++) & '/x0F';
 
 len >>= 1;

 for (i=0; i<len; i++) {
  c = (*asc++) << 4;
  c |= (*asc++) & '/x0F';
  
  *bcd++ = c;
 }
 
 if ( odd && fmt)
  *bcd = (*asc) << 4;

 return (i+odd);
}

int BCD2ASC (char *asc, const unsigned char *bcd, int len, int fmt)
{
 int i, odd;
 unsigned char c;
 
 odd = len&0x01;
 
 if ( odd && !fmt)
  *asc++ = ((*bcd++)&'/x0F') + '0';

 len >>= 1;

 for (i=0; i<len; i++) {
  c = *bcd++;
  *asc++ = (c>>4) + '0';
  *asc++ = (c&'/x0F') + '0';
 }
 
 if ( odd && fmt)
  *asc = ((*bcd)>>4) + '0';
 
 return (i+odd);
}

int BCD2INT(int *plen, const unsigned char *bcd, int len, int fmt)
{
 int l=0, i, odd;
 unsigned char c;
 
 odd = len&0x01;
 
 if ( odd && !fmt)
  l = (*bcd++)&'/x0F';

 len >>= 1;

 for (i=0; i<len; i++) {
  c = *bcd++;
  l *= 10;
  l += c>>4;
  l *= 10;
  l += c&'/x0F';
 }
 
 if ( odd && fmt)
 {
  l *= 10;
  l += (*bcd)>>4;
 }

 *plen = l;
 
 return (i+odd);
}

 

2008-04-15 14:03:00 zdhnh 阅读数 729
//将BCD码转为ASC串(0-f可转)
//NUMS==SOUR的BCD码数
//例:if sour=9999,nums=4 then dest=0x39,0x39,0x39,0x39
//    if sour=99999f nums=5,then dest=0x39,0x39,0x39,0x39,0x39 "f"is cut
int bcd_to_asc(char *sour,int nums,char *dest)
{
 int i,len,oddno=0;
 len=nums/2+nums%2;
 if((nums%2)!=0)
  oddno=1;
 memset(dest,'/0',nums);
 for(i=0;i<len;i++)
 {
  *(dest+2*i)=(*(sour+i)>>4)+0x30;
  if((i<(len-1))||((i==(len-1))&&(oddno==0)))
   *(dest+2*i+1)=(*(sour+i)&0x0f)+0x30;
 }
 return 0;

将ASC串转为BCD码

阅读数 872

没有更多推荐了,返回首页