Java & C# BCD编码与十进制转换
using System;
using System.Collections.Generic;
using System.Text;
namespace Base
{
    public class BCDHelper
    {
        /// <summary>
        /// 用BCD码压缩数字字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static byte[] StrToBCD(string str)
        {
            return StrToBCD(str, str.Length);
        }
        public static byte[] StrToBCD(string str, int numlen)
        {
            while (str.Length < numlen)
            {
                str = "0" + str;
            }
            return ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes(str), 0, numlen);
        }
/// <summary>
        /// 用BCD码压缩数字字符串
        /// </summary>
        /// <param name="NumBitByte"></param>
        /// <param name="offset">偏移量</param>
        /// <param name="numlen">数字字符串位数</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static byte[] ByteArrayToBCD(byte[] NumBitByte, int offset, int numlen)
        {
            //8位的ascii码
            int Num4Len = (numlen + 1) / 2 - 1;
            byte[] Num4bitByte = new byte[Num4Len + 1];
            Num4bitByte[Num4Len] = 0;
            for (int i = 0; i <= numlen - 1; i++)
            {
                byte num = 0;
if (i + offset >= NumBitByte.Length)
                {
                    //num = 255;
                    num = 0;
                }
                else
                {
                    num = Convert.ToByte(NumBitByte[i + offset] - 0x30);
                }
if (i % 2 == 0)
                {
                    Num4bitByte[i / 2] = Convert.ToByte((Num4bitByte[i / 2] & 0xf) | ((num << 4) & 0xFF));
                }
                else
                {
                    Num4bitByte[i / 2] = Convert.ToByte((Num4bitByte[i / 2] & 0xf0) | num);
                }
            }
return Num4bitByte;
        }
        /// <summary>
        /// BCD转int
        /// </summary>
        /// <param name="bcdNum"></param>
        /// <param name="offset">偏移量</param>
        /// <param name="numlen">数字字符串位数</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static int bcdToInt(byte[] bcdNum, int offset, int numlen)
        {
            return Convert.ToInt32(bcdToString(bcdNum, offset, numlen));
        }
/// <summary>
        /// BCD转字符串
        /// </summary>
        /// <param name="bcdNum"></param>
        /// <param name="offset">偏移量</param>
        /// <param name="numlen">数字字符串位数</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static string bcdToString(byte[] bcdNum, int offset, int numlen)
        {
            string retString = "";
            int res;
            var len = Math.DivRem(numlen, 2, out res);
            if (res != 0)
            {
                len++;
            }
for (int i = 0; i < len; i++)
            {
                retString += ((bcdNum[i + offset] & 0xf0) >> 4).ToString("x");
                retString += (bcdNum[i + offset] & 0xf).ToString("x");
            }
//Dim byteChar As Byte() = New Byte(length - 1) {}
            //Dim tempHigh As Byte = 0, tempLow As Byte = 0
            //Dim i As Integer = 0
            //While tempHigh <> &HF AndAlso tempLow <> &HF0
            //    tempHigh = Convert.ToByte(bcdNum(i + offset) And &HF0)
            //    '取出高四位;
            //    tempHigh = Convert.ToByte(tempHigh >> 4)
            //    tempLow = Convert.ToByte((bcdNum(i + offset) And &HF) << 4)
            //    byteChar(i) = Convert.ToByte(tempLow Or tempHigh)
            //    i += 1
            //End While
            //Dim HexString As String() = BitConverter.ToString(byteChar).Trim().Split("-"c)
            //For Each str As String In HexString
            //    retString += str.Trim()
            //Next
            //Dim LastIndex As Integer = retString.IndexOf("F"c)
            //retString = retString.Substring(0, LastIndex)
return retString.ToLower().Replace("f", "");
        }
/// <summary>
        /// BCD码转小时分钟
        /// date:2012-12-18
        /// author:guozh
        /// </summary>
        /// <param name="data"></param>
        /// <param name="offset">偏移位</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static System.DateTime Bcd2ToDateTime(byte[] data, int offset)
        {
            Int32 hour = default(Int32);
            Int32 minute = default(Int32);
            hour = Convert.ToInt32(bcdToString(data, offset, 2));
            minute = Convert.ToInt32(bcdToString(data, offset + 1, 2));
            return new System.DateTime(0000, 00, 00, hour, minute, 00);
        }
/// <summary>
        /// BCD码转日期
        /// </summary>
        /// <param name="data"></param>
        /// <param name="offset">偏移位</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static System.DateTime Bcd3ToDateTime(byte[] data, int offset)
        {
            Int32 year = default(Int32);
            Int32 month = default(Int32);
            Int32 day = default(Int32);
            year = Convert.ToInt32("20" + bcdToString(data, offset, 2));
            month = Convert.ToInt32(bcdToString(data, offset + 1, 2));
            day = Convert.ToInt32(bcdToString(data, offset + 2, 2));
            if (day == 0 || month == 0)
            {
                return DateTime.MinValue;
            }
            return new System.DateTime(year, month, day);
        }
        public static System.DateTime Bcd4ToDateTime(byte[] data, int offset)
        {
            Int32 year = default(Int32);
            Int32 month = default(Int32);
            Int32 day = default(Int32);
            try
            {
                year = Convert.ToInt32(bcdToString(data, offset, 4));
                month = Convert.ToInt32(bcdToString(data, offset + 2, 2));
                day = Convert.ToInt32(bcdToString(data, offset + 3, 2));
            }
            catch
            {
            }
            if (day == 0 || month == 0)
            {
                return DateTime.MinValue;
            }
            return new System.DateTime(year, month, day);
        }
        public static System.DateTime Bcd5ToDateTime(byte[] data, int offset)
        {
            var year = Convert.ToInt32("20" + bcdToString(data, offset, 2));
            var month = Convert.ToInt32(bcdToString(data, offset + 1, 2));
            var day = Convert.ToInt32(bcdToString(data, offset + 2, 2));
            var hour = Convert.ToInt32(bcdToString(data, offset + 3, 2));
            var minute = Convert.ToInt32(bcdToString(data, offset + 4, 2));
            if (day == 0 || month == 0)
            {
                return DateTime.MinValue;
            }
            return new DateTime(year, month, day, hour, minute, 0);
        }
        /// <summary>
        /// BCD码转时间格式
        /// </summary>
        /// <param name="data"></param>
        /// <param name="offset">偏移位</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static System.DateTime Bcd6ToDateTime(byte[] data, int offset)
        {
            try
            {
                if (data.Length < offset + 6)
                {
                    return DateTime.MinValue;
                }
                int year;// = Convert.ToInt32("20" + bcdToString(data, offset, 2));
                if (!int.TryParse("20" + bcdToString(data, offset, 2), out year))
                {
                    return DateTime.MinValue;
                }
                int month;// = Convert.ToInt32(bcdToString(data, offset + 1, 2));
                if (!int.TryParse(bcdToString(data, offset + 1, 2), out month))
                {
                    return DateTime.MinValue;
                }
                int day;// = Convert.ToInt32(bcdToString(data, offset + 2, 2));
                if (!int.TryParse(bcdToString(data, offset + 2, 2), out day))
                {
                    return DateTime.MinValue;
                }
                int hour;// = Convert.ToInt32(bcdToString(data, offset + 3, 2));
                if (!int.TryParse(bcdToString(data, offset + 3, 2), out hour))
                {
                    return DateTime.MinValue;
                }
                int minute;// = Convert.ToInt32(bcdToString(data, offset + 4, 2));
                if (!int.TryParse(bcdToString(data, offset + 4, 2), out minute))
                {
                    return DateTime.MinValue;
                }
                int second;// = Convert.ToInt32(bcdToString(data, offset + 5, 2));
                if (!int.TryParse(bcdToString(data, offset + 5, 2), out second))
                {
                    return DateTime.MinValue;
                }
                if (day == 0 || month == 0 || month > 12 || day > 31 || hour > 24 || minute > 60 || second > 60)
                {
                    return DateTime.MinValue;
                }
                return new DateTime(year, month, day, hour, minute, second);
            }
            catch
            {
                return DateTime.MinValue;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="offset"></param>
        /// <returns></returns>
        public static System.DateTime Bcd7ToDateTime(byte[] data, int offset)
        {
var year = Convert.ToInt32(bcdToString(data, offset, 4));
            var month = Convert.ToInt32(bcdToString(data, offset + 2, 2));
            var day = Convert.ToInt32(bcdToString(data, offset + 3, 2));
            var hour = Convert.ToInt32(bcdToString(data, offset + 4, 2));
            var minute = Convert.ToInt32(bcdToString(data, offset + 5, 2));
            var second = Convert.ToInt32(bcdToString(data, offset + 6, 2));
            if (day == 0 || month == 0 || year == 0)
            {
                return DateTime.MinValue;
            }
            return new DateTime(year, month, day, hour, minute, second);
        }
        /// <summary>
        /// 小时分钟转BCD码
        /// date:2012-12-18
        /// author:guozh
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static byte[] DateTimeToBcd2(System.DateTime dt)
        {
            List<byte> lst = new List<byte>();
            //StringBuilder sb = new StringBuilder();
            //sb.Append(dt.Hour.ToString("D2"));
            //sb.Append(dt.Minute.ToString("D2"));
            lst.AddRange(StrToBCD(dt.ToString("HHmm")));
            return lst.ToArray();
        }
        /// <summary>
        /// 日期转BCD码
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static byte[] DateTimeToBcd3(System.DateTime dt)
        {
List<byte> lst = new List<byte>();
//StringBuilder sb = new StringBuilder();
            //sb.Append((dt.Year - 2000).ToString("D2"));
            //sb.Append(dt.Month.ToString("D2"));
            //sb.Append(dt.Day.ToString("D2"));
            lst.AddRange(StrToBCD(dt.ToString("yyMMdd")));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Year - 2000).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Month).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Day).ToString()), 0, 2));
return lst.ToArray();
        }
        public static byte[] DateTimeToBcd4(System.DateTime dt)
        {
            List<byte> lst = new List<byte>();
            StringBuilder sb = new StringBuilder();
            sb.Append((dt.Year).ToString("D4"));
            sb.Append(dt.Month.ToString("D2"));
            sb.Append(dt.Day.ToString("D2"));
            lst.AddRange(StrToBCD(sb.ToString()));
            return lst.ToArray();
        }
        public static byte[] DateTimeToBcd5(System.DateTime dt)
        {
            List<byte> lst = new List<byte>();
            var strTime = dt.ToString("yyMMddHHmm");
            lst.AddRange(StrToBCD(strTime));
//lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Year - 2000).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Month).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Day).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Hour).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Minute).ToString()), 0, 2));
            return lst.ToArray();
        }
        public static byte[] DateTimeToBcd6(System.DateTime dt)
        {
            try
            {
                List<byte> lst = new List<byte>();
                var strTime = dt.ToString("yyMMddHHmmss");
                lst.AddRange(StrToBCD(strTime));
//lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Year - 2000).ToString()), 0, 2));
                //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Month).ToString()), 0, 2));
                //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Day).ToString()), 0, 2));
                //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Hour).ToString()), 0, 2));
                //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Minute).ToString()), 0, 2));
                //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Second).ToString()), 0, 2));
return lst.ToArray();
            }
            catch (System.Exception ex)
            {
return new byte[] { 0, 0, 0, 0, 0, 0 };
            }
        }
        public static byte[] DateTimeToBcd7(System.DateTime dt)
        {
            List<byte> lst = new List<byte>();
StringBuilder sb = new StringBuilder();
            sb.Append(dt.Year.ToString("D4"));
            sb.Append(dt.Month.ToString("D2"));
            sb.Append(dt.Day.ToString("D2"));
            sb.Append(dt.Hour.ToString("D2"));
            sb.Append(dt.Minute.ToString("D2"));
            sb.Append(dt.Second.ToString("D2"));
            lst.AddRange(StrToBCD(sb.ToString()));
//lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes(dt.Year.ToString()), 0, 4));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Month).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Day).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Hour).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Minute).ToString()), 0, 2));
            //lst.AddRange(ByteArrayToBCD(System.Text.Encoding.ASCII.GetBytes((dt.Second).ToString()), 0, 2));
return lst.ToArray();
        }
    }
}
--------------------- 
作者:boonya 
来源:CSDN 
原文:https://blog.csdn.net/boonya/article/details/83537827
Java & C# BCD编码与十进制转换的更多相关文章
- java笔记--ASCII编码认知和转换
		ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示英语字符是当今最通用的单字节编码.包括128个字符. --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs. ... 
- 理清Java中的编码解码转换
		1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ... 
- 自己动手写Java大整数《3》除法和十进制转换
		之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ... 
- Java 二进制,八进制,十进制,十六进制转换
		A.十进制转换其他 十进制转成二进制 Integer.toBinaryString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成十六进制: ... 
- 图片和base64编码字符串 互相转换,图片和byte数组互相转换
		图片和base64编码字符串 互相转换 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; ... 
- 黑马程序员_Java基础:十进制转换其他进制
		------- android培训.java培训.期待与您交流! ---------- 平时使用中,进制转换只要使用Integer这个包装类中的方法即可完成. 但其实我们也能用自己的方法去实现,这有助 ... 
- java String.getBytes()编码问题——String.getBytes(charset)
		String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ... 
- 一个java的DES加解密类转换成C#
		原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ... 
- windows下编译java源文件的编码错误
		import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ... 
随机推荐
- 自己DIY出来一个JSON结构化展示器
			说来也巧,这个玩意,一直都想亲手写一个,因为一直用着各种网上提供的工具,觉得这个还是有些用途,毕竟,后面的实现思路和原理不是太复杂,就是对json的遍历,然后给予不同节点类型以不同的展现风格. 我这次 ... 
- 转 一个oracle11g 使用exp导出空表丢失的问题分析及解决办法
			用exp无法导出空表解决方法 最早的一次使用oracle 11g导出数据发现有的表丢失了,感觉莫名其妙的,后来终于找到原因了. 找到问题以后,再看看解决方案.11GR2中有个新特性,当表无数据时,不分 ... 
- SSO单点登录三种情况的实现方式详解
			单点登录(SSO——Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子系统——百度经验.百度知道.百度文库等 ... 
- Python——Sublime Text3编写Python的一些问题
			1.回车键不能结束input()函数,如何解决? https://www.cnblogs.com/pcat/p/5499964.html 安装了该插件后,会遇到一些麻烦,这样运行Python程序很不 ... 
- hive 一次更新多个分区的数据
			类似订单数据之类的表,因为有状态要更新,比如订单状态,物流状态之类的, 这样就需要同步很久之前的数据,目前我的订单表是更新前面100天的数据. hive中操作是先删除前面100个分区的数据,然后重新动 ... 
- uniapp仿h5+fire自定义事件触发监听
			仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ... 
- Problem B: 故障电灯(light)
			考虑对电灯进行差分:若第i个电灯和第i + 1个电灯状态不同,则在第i个位置上放一个球 这样我们就放置了不超过2n个球,且必然是偶数个 于是问题转化为:有m个球,每一步可以把一个球平移奇质数个位置,两 ... 
- 4-linux、hdfs命令
			定义: linux:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的 操作系统.它能运行主要的UNIX工具软件.应用程序和 ... 
- [UnityShader基础]06.#pragma multi_compile
			参考链接: https://blog.csdn.net/qq826364410/article/details/81774741 https://docs.unity3d.com/Manual/SL- ... 
- cd tom-bash: cannot create temp file for here-document: No space left on device
			Linux使用tab补全时提示 cd tom-bash: cannot create temp file for here-document: No space left on device 这是因为 ... 
