c# 十进制数如何转化为BCD码

时间:2021-08-15 22:25:09
如题,请问如何将十进制数转化为BCD码,比如1235,如何转化为BCD码(8421码)? 请哪位大侠给出源码,小弟感激不尽。

21 个解决方案

#1


自己鼎

#2


十进制的每一位分别转换为4为的二进制数就OK啦!!

#3


晕死,不用转了,在计算机中,所有的数字类型,都是用8421码存储的(也就是常说的二进制编码)

Binary-Coded Decimal‎,
如果你说的转换的意思是说,把一个十进制的数,转换成8421码的字符串,那才需要转换


给你一个我自己写的转换函数


/// <summary>
/// 获取一个byte数二进制流的字符表现形式
/// </summary>
/// <param name="InputValue"></param>
/// <returns></returns>
public static char[] GetByBinary( int InputValue )
{
byte k = 0;
int temp;
const int SHIFT = sizeof( int ) * 8 - 1;
char[] OutString = new char[SHIFT + 1];
const int Mask = ( int )1 << SHIFT;
temp = InputValue;
for ( int j = 0; j <= SHIFT; j++ )
{
OutString[k++] = ( ( temp & Mask ) == 0 ? '0' : '1' );
temp <<= 1;
}
return OutString;
}

#4


好像理解错了,呵呵,

#5


  string _Value=GetBcdEncode(12345, BcdType.码8421);

            ulong _NumbValue;
            if (GetBcdDecode(_Value, BcdType.码8421, out _NumbValue))
            {
                MessageBox.Show(_NumbValue.ToString());
            }

不知道是不是你想要的.


      public enum BcdType
        {
            码8421,
            码5421,
            码2421,
            余3码,
            余3循环码
        }
        /// <summary>
        /// 或BCD表数据
        /// </summary>
        /// <returns></returns>
        private static DataTable GetBcdTable()
        {
            DataTable _BCDTable = new DataTable();
            _BCDTable.Columns.Add("十进制数");
            _BCDTable.Columns.Add("码8421");
            _BCDTable.Columns.Add("码5421");
            _BCDTable.Columns.Add("码2421");
            _BCDTable.Columns.Add("余3码");
            _BCDTable.Columns.Add("余3循环码");

            _BCDTable.Rows.Add(new object[] { "0", "0000", "0000", "0000", "0011", "0010" });
            _BCDTable.Rows.Add(new object[] { "1", "0001", "0001", "0001", "0100", "0110" });
            _BCDTable.Rows.Add(new object[] { "2", "0010", "0010", "0010", "0101", "0111" });
            _BCDTable.Rows.Add(new object[] { "3", "0011", "0011", "0011", "0110", "0101" });
            _BCDTable.Rows.Add(new object[] { "4", "0100", "0100", "0100", "0111", "0100" });
            _BCDTable.Rows.Add(new object[] { "5", "0101", "1000", "1011", "1000", "1100" });
            _BCDTable.Rows.Add(new object[] { "6", "0110", "1001", "1100", "1001", "1101" });
            _BCDTable.Rows.Add(new object[] { "7", "0111", "1010", "1101", "1010", "1111" });
            _BCDTable.Rows.Add(new object[] { "8", "1000", "1011", "1110", "1011", "1110" });
            _BCDTable.Rows.Add(new object[] { "9", "1001", "1100", "1111", "1100", "1010" });
            return _BCDTable;            

        }
        
        /// <summary>
        /// BCD解码
        /// </summary>
        /// <param name="p_Value">BCD码</param>
        /// <param name="p_BcdType">BCD码类型</param>
        /// <param name="p_LongValue">返回数据</param>
        /// <returns>false 解码失败 true解编成功</returns>
        public static bool GetBcdDecode(string p_Value, BcdType p_BcdType,out ulong p_LongValue)
        {
            DataTable _BCDTable = GetBcdTable();
            p_LongValue = 0;
            StringBuilder _Return = new StringBuilder();
            if (p_Value.Length % 4 == 0)
            {
                int _Count = p_Value.Length / 4;               
                string _ValueText = p_Value.ToString();
                for (int i = 0; i != _Count; i++)
                {
                    DataRow[] _Row = _BCDTable.Select(p_BcdType.ToString() + "=" + _ValueText.Substring(i*4,4));
                    if (_Row.Length == 0) return false;
                    _Return.Append(_Row[0]["十进制数"].ToString());
                }
                p_LongValue= Convert.ToUInt64(_Return.ToString());
                return true;
            }
            return false;
        }

        /// <summary>
        /// BCD编码
        /// </summary>
        /// <param name="p_Value">数据</param>
        /// <param name="p_BcdType">编码方式</param>
        /// <returns>编码 ""</returns>
        public static string GetBcdEncode(ulong p_Value, BcdType p_BcdType)
        {
            DataTable _BCDTable = GetBcdTable();
            StringBuilder _Return = new StringBuilder();
            string _ValueText = p_Value.ToString();
            for (int i = 0; i != _ValueText.Length; i++)
            {
                DataRow[] _Row = _BCDTable.Select("十进制数=" + _ValueText[i].ToString());
                if (_Row.Length == 0) return "";
                _Return.Append(_Row[0][p_BcdType.ToString()].ToString());
            }
            return _Return.ToString();         
        }

#6


 我的方法,对该数%2,/2,这样一路下来就可以了.

#7



int toBCD(int a){
    int ret = 0, shl = 0;
    while (a > 0) {
        ret |= (a % 10) << shl;
        a /= 10;
        shl += 4;
    }
    return ret;
}


运行一下,看看是不是你想要的

#8


小弟是在写一个上位机程序,要向串口下发一条数据。
格式为:0A5H,0E2H,02H,数据1-数据10(BCD码),和校验值。
数据1-数据10为:日标量高两位、低两位、秒时量高两位、低两位、达成量高两位、低两位、不良量高两位、低两位、计时周期高两位、低两位。

在软件里面输入的是十进制数,那肯定要转化为BCD码然后发给下位机。

#9


回帖是一种美德!每天回帖即可获得 10 分可用分

#10


晕 不会

#11


string toBCD(int a)
        {
            int shl;        
            string ret = string.Empty;
            while (a > 0)
            {
                string c = string.Empty;
                shl = (a % 10);
                a /= 10;
                while (shl > 0)
                {
                    c = (shl % 2).ToString() + c;
                    shl /= 2;
                }
                ret = c.PadLeft(4, '0') + ret;
            }
            return ret;
        }

#12


输入框输入的是字符串,还是直接用查表转换的方法更快吧!
先建立个0~9的BCD码表,按位取出每位十进制数(还是字符),对应查表

#13


学习@_@

#14


楼上的很好很强大,佩服!值得我学习

#15


每天回帖真的可以加分吗,试试看,明天就可以知道是不是真的了。

#16


1235转化为BCD码
我从最高位开始:首先将各个为分别转为二进制,如下:
1-001
2-010
3-011
5-101
而后组合一下:
001,010,011,101
即:1235转化为BCD码为001,010,011,101

#17


1235转化为BCD码 
我从最高位开始:首先将各个为分别转为二进制,如下: 
1-0001 
2-0010 
3-0011 
5-0101 
而后组合一下: 
0001,0010,0011,0101 
即:1235转化为BCD码为0001,0010,0011,0101 

#18


1235转化为BCD码 
我从最高位开始:首先将各个为分别转为二进制,如下: 
1-0001 
2-0010 
3-0011 
5-0101 
而后组合一下: 
0001,0010,0011,0101 
即:1235转化为BCD码为0001,0010,0011,0101 

#19


我也刚好用到串口通讯发送十进制,转成BCD码进行奇偶校验

#20


我也遇到这个问题了。。。。

#21


最后怎么解决的呀,现在我也遇到这个问题了,求助呀

#1


自己鼎

#2


十进制的每一位分别转换为4为的二进制数就OK啦!!

#3


晕死,不用转了,在计算机中,所有的数字类型,都是用8421码存储的(也就是常说的二进制编码)

Binary-Coded Decimal‎,
如果你说的转换的意思是说,把一个十进制的数,转换成8421码的字符串,那才需要转换


给你一个我自己写的转换函数


/// <summary>
/// 获取一个byte数二进制流的字符表现形式
/// </summary>
/// <param name="InputValue"></param>
/// <returns></returns>
public static char[] GetByBinary( int InputValue )
{
byte k = 0;
int temp;
const int SHIFT = sizeof( int ) * 8 - 1;
char[] OutString = new char[SHIFT + 1];
const int Mask = ( int )1 << SHIFT;
temp = InputValue;
for ( int j = 0; j <= SHIFT; j++ )
{
OutString[k++] = ( ( temp & Mask ) == 0 ? '0' : '1' );
temp <<= 1;
}
return OutString;
}

#4


好像理解错了,呵呵,

#5


  string _Value=GetBcdEncode(12345, BcdType.码8421);

            ulong _NumbValue;
            if (GetBcdDecode(_Value, BcdType.码8421, out _NumbValue))
            {
                MessageBox.Show(_NumbValue.ToString());
            }

不知道是不是你想要的.


      public enum BcdType
        {
            码8421,
            码5421,
            码2421,
            余3码,
            余3循环码
        }
        /// <summary>
        /// 或BCD表数据
        /// </summary>
        /// <returns></returns>
        private static DataTable GetBcdTable()
        {
            DataTable _BCDTable = new DataTable();
            _BCDTable.Columns.Add("十进制数");
            _BCDTable.Columns.Add("码8421");
            _BCDTable.Columns.Add("码5421");
            _BCDTable.Columns.Add("码2421");
            _BCDTable.Columns.Add("余3码");
            _BCDTable.Columns.Add("余3循环码");

            _BCDTable.Rows.Add(new object[] { "0", "0000", "0000", "0000", "0011", "0010" });
            _BCDTable.Rows.Add(new object[] { "1", "0001", "0001", "0001", "0100", "0110" });
            _BCDTable.Rows.Add(new object[] { "2", "0010", "0010", "0010", "0101", "0111" });
            _BCDTable.Rows.Add(new object[] { "3", "0011", "0011", "0011", "0110", "0101" });
            _BCDTable.Rows.Add(new object[] { "4", "0100", "0100", "0100", "0111", "0100" });
            _BCDTable.Rows.Add(new object[] { "5", "0101", "1000", "1011", "1000", "1100" });
            _BCDTable.Rows.Add(new object[] { "6", "0110", "1001", "1100", "1001", "1101" });
            _BCDTable.Rows.Add(new object[] { "7", "0111", "1010", "1101", "1010", "1111" });
            _BCDTable.Rows.Add(new object[] { "8", "1000", "1011", "1110", "1011", "1110" });
            _BCDTable.Rows.Add(new object[] { "9", "1001", "1100", "1111", "1100", "1010" });
            return _BCDTable;            

        }
        
        /// <summary>
        /// BCD解码
        /// </summary>
        /// <param name="p_Value">BCD码</param>
        /// <param name="p_BcdType">BCD码类型</param>
        /// <param name="p_LongValue">返回数据</param>
        /// <returns>false 解码失败 true解编成功</returns>
        public static bool GetBcdDecode(string p_Value, BcdType p_BcdType,out ulong p_LongValue)
        {
            DataTable _BCDTable = GetBcdTable();
            p_LongValue = 0;
            StringBuilder _Return = new StringBuilder();
            if (p_Value.Length % 4 == 0)
            {
                int _Count = p_Value.Length / 4;               
                string _ValueText = p_Value.ToString();
                for (int i = 0; i != _Count; i++)
                {
                    DataRow[] _Row = _BCDTable.Select(p_BcdType.ToString() + "=" + _ValueText.Substring(i*4,4));
                    if (_Row.Length == 0) return false;
                    _Return.Append(_Row[0]["十进制数"].ToString());
                }
                p_LongValue= Convert.ToUInt64(_Return.ToString());
                return true;
            }
            return false;
        }

        /// <summary>
        /// BCD编码
        /// </summary>
        /// <param name="p_Value">数据</param>
        /// <param name="p_BcdType">编码方式</param>
        /// <returns>编码 ""</returns>
        public static string GetBcdEncode(ulong p_Value, BcdType p_BcdType)
        {
            DataTable _BCDTable = GetBcdTable();
            StringBuilder _Return = new StringBuilder();
            string _ValueText = p_Value.ToString();
            for (int i = 0; i != _ValueText.Length; i++)
            {
                DataRow[] _Row = _BCDTable.Select("十进制数=" + _ValueText[i].ToString());
                if (_Row.Length == 0) return "";
                _Return.Append(_Row[0][p_BcdType.ToString()].ToString());
            }
            return _Return.ToString();         
        }

#6


 我的方法,对该数%2,/2,这样一路下来就可以了.

#7



int toBCD(int a){
    int ret = 0, shl = 0;
    while (a > 0) {
        ret |= (a % 10) << shl;
        a /= 10;
        shl += 4;
    }
    return ret;
}


运行一下,看看是不是你想要的

#8


小弟是在写一个上位机程序,要向串口下发一条数据。
格式为:0A5H,0E2H,02H,数据1-数据10(BCD码),和校验值。
数据1-数据10为:日标量高两位、低两位、秒时量高两位、低两位、达成量高两位、低两位、不良量高两位、低两位、计时周期高两位、低两位。

在软件里面输入的是十进制数,那肯定要转化为BCD码然后发给下位机。

#9


回帖是一种美德!每天回帖即可获得 10 分可用分

#10


晕 不会

#11


string toBCD(int a)
        {
            int shl;        
            string ret = string.Empty;
            while (a > 0)
            {
                string c = string.Empty;
                shl = (a % 10);
                a /= 10;
                while (shl > 0)
                {
                    c = (shl % 2).ToString() + c;
                    shl /= 2;
                }
                ret = c.PadLeft(4, '0') + ret;
            }
            return ret;
        }

#12


输入框输入的是字符串,还是直接用查表转换的方法更快吧!
先建立个0~9的BCD码表,按位取出每位十进制数(还是字符),对应查表

#13


学习@_@

#14


楼上的很好很强大,佩服!值得我学习

#15


每天回帖真的可以加分吗,试试看,明天就可以知道是不是真的了。

#16


1235转化为BCD码
我从最高位开始:首先将各个为分别转为二进制,如下:
1-001
2-010
3-011
5-101
而后组合一下:
001,010,011,101
即:1235转化为BCD码为001,010,011,101

#17


1235转化为BCD码 
我从最高位开始:首先将各个为分别转为二进制,如下: 
1-0001 
2-0010 
3-0011 
5-0101 
而后组合一下: 
0001,0010,0011,0101 
即:1235转化为BCD码为0001,0010,0011,0101 

#18


1235转化为BCD码 
我从最高位开始:首先将各个为分别转为二进制,如下: 
1-0001 
2-0010 
3-0011 
5-0101 
而后组合一下: 
0001,0010,0011,0101 
即:1235转化为BCD码为0001,0010,0011,0101 

#19


我也刚好用到串口通讯发送十进制,转成BCD码进行奇偶校验

#20


我也遇到这个问题了。。。。

#21


最后怎么解决的呀,现在我也遇到这个问题了,求助呀