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编码与十进制转换的更多相关文章

  1. java笔记--ASCII编码认知和转换

    ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示英语字符是当今最通用的单字节编码.包括128个字符. --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs. ...

  2. 理清Java中的编码解码转换

    1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...

  3. 自己动手写Java大整数《3》除法和十进制转换

    之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...

  4. Java 二进制,八进制,十进制,十六进制转换

    A.十进制转换其他 十进制转成二进制  Integer.toBinaryString(int i) 十进制转成八进制  Integer.toOctalString(int i) 十进制转成十六进制:  ...

  5. 图片和base64编码字符串 互相转换,图片和byte数组互相转换

    图片和base64编码字符串 互相转换 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; ...

  6. 黑马程序员_Java基础:十进制转换其他进制

    ------- android培训.java培训.期待与您交流! ---------- 平时使用中,进制转换只要使用Integer这个包装类中的方法即可完成. 但其实我们也能用自己的方法去实现,这有助 ...

  7. java String.getBytes()编码问题——String.getBytes(charset)

    String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ...

  8. 一个java的DES加解密类转换成C#

    原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...

  9. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

随机推荐

  1. 未能加载文件或程序集“SuperMap.Mapping, Version=7.0.0.0, Culture=neutral, PublicKeyToken=0635c574ea890381”或它的某一个依赖项。试图加载格式不正确的程序。

    开发SuperMap.Mapping的时候,蹦出来的错误!让人摸不着头脑.查找原因如下: (1)安装32位的super map iobject后,进行开发,vs上选择目标平台是x86位的,然后从控件列 ...

  2. aspnetcore 日志 serilog-aspnetcore

    serilog-aspnetcore https://github.com/serilog/serilog-aspnetcore public static void Main(string[] ar ...

  3. DiscuzX2.5,X3.0,X3.1,X3.2完整目录结构【模板目录template】

    /template/default/common  公共模板目录全局加载 block_forumtree.htm  DIY论坛树形列表模块 block_thread.htm  DIY帖子模块调用文件 ...

  4. 51nod1227 平均最小公倍数

    $Ans(l,r)=ans(r)-ans(l-1)\\ans(n)=\sum\limits_{i=1}^n \sum\limits_{j=1}^i \frac{j}{gcd(i,j)}\\=\sum\ ...

  5. 数据库事务的四大特性以及事务的隔离级别(mysql)

      本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指 ...

  6. Linq to SQL -- Union All、Union、Intersect和Top、Bottom和Paging和SqlMethods

    Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1. ...

  7. java——什么是浅表副本

    ArrayList.clone(),hashtable.clone()方法返回此ArrayList的浅表副本(不复制这些元素本身),那么什么是浅表副本? 一个集合的浅度拷贝意味着只拷贝集合中的元素,不 ...

  8. 使用JavaMail创建邮件和发送邮件

    参考https://www.cnblogs.com/xdp-gacl/p/4216311.html,写的真好,知识在于分享,备份留着看 一.RFC882文档简单说明 RFC882文档规定了如何编写一封 ...

  9. Oracle 归档日志文件

      今天数据群有人反应网站不能正常打开,经检查Oracle数据库远程连不上,提示信息:ORA-00257: archiver error. Connect internal only, until f ...

  10. Python PEP8 编码规范

    代码编排 缩进.缩进4个空格,不能混合使用Tab和空格. 每行最大长度79,文档字符串和注释行最大长度为72,换行可以使用反斜杠,最好使用圆括号. 类和顶层函数定义之间空两行:类中的方法定义以单行分隔 ...