☰
【AI】C# .NET Framework 4.8 BCD解码
2026/10/14 18:25:38 网站建设 项目流程

C# .NET Framework 4.8 BCD解码(Byte[] → 十进制字符串/数字)

BCD(8421码):1个byte存2位十进制数,高4bit是十位,低4bit是个位。
例:0x12→ BCD解码 = “12”;0x59→ “59”;0x05→ “05”

一、基础解码函数(byte[] BCD数组转十进制字符串,最常用)

/// <summary> /// BCD解码:byte[] 8421BCD 转十进制字符串 /// .NET4.8 可用 /// </summary> /// <param name="bcdBytes">BCD字节数组</param> /// <returns>十进制字符串(保留前导0)</returns> public static string BcdBytesToString(byte[] bcdBytes) { if (bcdBytes == null || bcdBytes.Length == 0) return string.Empty; char[] resultChars = new char[bcdBytes.Length * 2]; for (int i = 0; i < bcdBytes.Length; i++) { byte b = bcdBytes[i]; // 高4位 int high = (b >> 4) & 0x0F; // 低4位 int low = b & 0x0F; // 校验BCD合法性:单个4bit不能>=10 if (high >= 10 || low >= 10) { throw new FormatException($"非法BCD字节:0x{b:X2},BCD每4bit范围0~9"); } resultChars[i * 2] = (char)('0' + high); resultChars[i * 2 + 1] = (char)('0' + low); } return new string(resultChars); }

调用示例

byte[] bcdData = { 0x12, 0x34, 0x05 }; string str = BcdBytesToString(bcdData); Console.WriteLine(str); // 输出:123405

二、如果需要直接解析成数值(long,注意溢出)

适合BCD长度≤8字节(最多16位十进制,long上限是9223372036854775807)

public static long BcdBytesToLong(byte[] bcdBytes) { string s = BcdBytesToString(bcdBytes); if (long.TryParse(s, out long val)) return val; throw new OverflowException("BCD数值超出long范围"); }

三、反向:十进制字符串编码成BCD(附赠,经常配套使用)

/// <summary> /// 字符串转BCD数组(8421),字符串长度必须偶数位,不足前面补0 /// </summary> public static byte[] StringToBcdBytes(string numStr) { if (numStr == null) throw new ArgumentNullException(); numStr = numStr.Trim(); if (numStr.Length % 2 != 0) numStr = "0" + numStr; // 奇数长度前面补0 byte[] bcd = new byte[numStr.Length / 2]; for (int i = 0; i < bcd.Length; i++) { char c1 = numStr[i * 2]; char c2 = numStr[i * 2 + 1]; byte high = (byte)(c1 - '0'); byte low = (byte)(c2 - '0'); bcd[i] = (byte)((high << 4) | low); } return bcd; }

四、两种常见BCD格式注意区分

  1. 压缩BCD(上面代码,1字节2位):工业/仪表/Modbus最常用
  2. 非压缩BCD(1字节1位,低4bit有效):极少用,需要单独写

⚠️ 坑点:

  • 有些设备BCD是小端序(字节顺序颠倒),读到byte[]后先反转数组再解码
  • 有些BCD末尾带符号位,需要单独处理符号
  • BCD校验:4bit的值不能是10~15,否则不是合法BCD,代码里已经抛异常

小端BCD示例(设备字节倒序)

byte[] raw = {0x34,0x12}; // 设备小端BCD,实际数字1234 Array.Reverse(raw); string res = BcdBytesToString(raw); // "1234"

五、简易无异常版本(不想抛异常,非法字符替换为?)

public static string BcdBytesToStringSafe(byte[] bcdBytes) { if (bcdBytes == null || bcdBytes.Length == 0) return ""; char[] chars = new char[bcdBytes.Length * 2]; for (int i = 0; i < bcdBytes.Length; i++) { byte b = bcdBytes[i]; int h = (b >> 4) & 0x0F; int l = b & 0x0F; chars[i * 2] = h < 10 ? (char)('0' + h) : '?'; chars[i * 2 + 1] = l < 10 ? (char)('0' + l) : '?'; } return new string(chars); }

你要不要我再写一个BCD转BigInteger版本,支持超过long范围的超长BCD(比如20位以上十进制)?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询