DateTime в BCD представление - PullRequest
2 голосов
/ 25 февраля 2012

Как мне преобразовать DateTime (yyyyMMddhhmm) в упакованное bcd (размер 6) представление на c #?

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 ]

2 голосов
/ 25 февраля 2012

То, что вы получаете, является правильным 18 == 12 (Hex) при переходе на to_bcd.

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();
}
1 голос
/ 25 февраля 2012

Я приведу короткий пример, чтобы продемонстрировать идею. Вы можете распространить это решение на весь формат ввода даты.

Формат 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...