Alex Sprint Ответов: 2

Как преобразовать byte[] в datetime


Привет, я читаю текущую дату и время в байтовый массив, как преобразовать байтовый массив обратно в DateTime ?

Что я уже пробовал:

public static byte ConvertToBcd(byte x)
{

    int msb = x / 10;

    int lsb = x - (msb * 10);

    msb = msb << 4;

    return (byte)(msb | lsb);

}


public static byte[] GetLocalTimeInBCD()
{

    DateTime now = DateTime.Now;

    byte[] Data = new byte[4];

    Data[0] = (byte)(now.Year - 100);

    Data[1] = (byte)now.Month;

    Data[2] = (byte)now.Day;

    Data[3] = (byte)now.Hour;


    for (int i = 0; i < 4; i++)
    {

        Data[i] = ConvertToBcd(Data[i]);

    }

    return Data;

}

Philippe Mori

now.Year - 100 подозрительный. Год в дате времени - это "четыре цифры". Таким образом, мы находимся в 2016 году, а не в 16 или 116...

Alex Sprint

Я согласен, но чтобы проверить, правильно ли преобразование byte [], я должен преобразовать его обратно в DateTime. Поэтому я ищу помощи.

Philippe Mori

2016 - 100 даст 1916, который будет переполнение байта. Это не служит никакой полезной цели, чтобы исправить преобразование в BCD, если входные данные неверны. Эта проблема будет еще хуже, как в BCD компенсатор плавучести может представлять только 100 номеров... В этом случае он не даст действительного номера BCD.

Alex Sprint

Привет, Филипп, не могли бы вы мне помочь, как получить текущую дату-время и преобразовать ее в 4 байта[] ?

2 Ответов

Рейтинг:
9

Er. Puneet Goel

Метод FromBinary принимает длинное значение, созданное с помощью метода ToBinary. Он содержит компоненты Kind и Ticks, и это не то, что содержит временная метка базы данных.

Использование BitConverter для получения длинного значения является правильным, но тогда вы должны взять начало отсчета времени для метки времени и добавить длинное значение в качестве правильной единицы измерения. Предполагая, что это временная метка из базы данных MySQL, IIRC-это количество миллисекунд от 1980-01-01:

//Convert DateTime to bytes (always convert datetime to ticks)
byte[] byteValue = BitConverter.GetBytes(DateTime.Now.Ticks);
//Convert datetime to longvalue
long longVar = BitConverter.ToInt64(byteValue, 0);
//Convert to datetime.
DateTime dateTimeVar = new DateTime(longVar);


Alex Sprint

Эй, Пунит, я конвертирую всю дату и время.Теперь для byte[] мне нужно преобразовать его обратно в DateTime.

Er. Puneet Goel

//Преобразовать datetime в байт (всегда преобразовать datetime в клещи)
byte[] byteValue = BitConverter.Метод Getbytes(Типа Datetime.Сейчас.Клещей);
// Преобразование datetime в longvalue
long longVar = BitConverter.ToInt64(byteValue, 0);
// Преобразование в datetime.
DateTime dateTimeVar = new DateTime(longVar);

Alex Sprint

Привет, Пунит, Спасибо за ваше предложение.
Как пометить это как решение ?

Er. Puneet Goel

Дорогой, просто примите решение 1 выше как решение. Я только что обновил решение.

Рейтинг:
1

CPallini

Что ж, вам нужно просто повернуть процесс вспять. Начните с

public static byte ConvertFromBcd(byte bcd)
 {
   return (byte) ((bcd >> 4) * 10 + (bcd & 0XF));
 }