日期时间转化为BCD表示法

3

我该如何在C#中将DateTime(yyyyMMddhhmm)转换为压缩的BCD(大小为6)表示形式?

using System;

namespace Exercise
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            byte res = to_bcd(12);
        }

        private static byte to_bcd(int n)
        {
            // extract each digit from the input number n
            byte d1 = Convert.ToByte(n/10);
            byte d2 = Convert.ToByte(n%10);
            // combine the decimal digits into a BCD number
            return Convert.ToByte((d1 << 4) | d2);
        }
    }
}

您在res变量上得到的结果为18。
谢谢!
2个回答

3
您得到的是正确的结果,因为您传递给to_bcd函数的值为18,转化为十六进制后为12。
static byte[] ToBCD(DateTime d)
{
    List<byte> bytes = new List<byte>();
    string s = d.ToString("yyyyMMddHHmm");
    for (int i = 0; i < s.Length; i+=2 )
    {
        bytes.Add((byte)((s[i] - '0') << 4 | (s[i+1] - '0')));
    }
    return bytes.ToArray();
}

2
@TzvikaPika,当我们喜欢一个答案时,在SO上我们该怎么做? - L.B

1
我会给一个简短的例子来演示这个想法。你可以将此解决方案扩展到整个日期格式输入。
BCD 格式将精确地封装两个十进制数字到一个 8 位数字中。例如,92 的表示形式在二进制中是:
1001 0010

或在十六进制中表示为0x92。当转换为十进制时,它等于146

要完成此操作的代码需要将第一个数字左移4个位,然后与第二个数字组合。因此:

byte to_bcd(int n)
{
    // extract each digit from the input number n
    byte d1 = n / 10;
    byte d2 = n % 10;
    // combine the decimal digits into a BCD number
    return (d1 << 4) | d2;
}

嗨Greg,感谢您的快速回复,但我真的没有明白。 我像您在第一条消息中建议的那样对int=12进行操作(完整示例)。你得到的res变量的结果是18。我期望这里是一个1字节的表示方式。 另外,对于长时间DateTime (yyyyMMddhhmm),应该怎么办?我应该将其转换为int64表示形式,然后将其拆分成6个大小为2的整数吗?谢谢! - Tzvika Pika
你的计算是正确的。十进制数18在十六进制中表示为0x12,这也是十二进制的BCD表示。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接