Borland TDateTime для преобразования.NET DateTime

У меня проблема преобразования числа в дату, похожая на

Как преобразовать двойное значение в DateTime в C#?

Информация о временной дате, которую я получаю, извлекается как 8-байтовый из потока данных UDP. Это кодируется как двойной тип объекта TDateTime в Borland C++, который совместим с COM datetime.

Я декодирую этот поток данных в Visual Studio C#, и любое приведение к объекту DateTime идет со странными датами.

Я думал, что DateTime.FromBinary() может сделать трюк, но это также неправильно декодирует время / дату.

Шестнадцатеричные значения для now() сильно различаются между двумя системами:

Borland: 0x 40E4A17C20782C71
C#     : 0x 8E6EA19D6CB5D288

Эти значения были взяты несколько секунд друг от друга, но они явно отличаются.

Если у кого-то есть какие-либо предложения о том, как конвертировать это, я был бы признателен!

1 ответ

Решение

BitConverter ( Как преобразовать байтовый массив в двойной массив в C#?) В сочетании с DateTime.FromOADate from ( Как преобразовать двойное значение в DateTime в C#?) - это то, что вам нужно:

var date = DateTime.FromOADate(BitConverter.ToDouble(
    (new byte[]{0x40,0xE4,0xA1,0x7C,0x20,0x78,0x2C,0x71}).Reverse().ToArray(),
  0));

Примечание - в зависимости от того, как вы читаете байты, вам может потребоваться смещение, отличное от 0 (если вы читаете в байтовый массив), и вам может не потребоваться Reverse (может зависеть от порядкового номера между системами). Также в зависимости от того, как вы читаете данные, что-то вроде BinaryReader.ReadDouble может быть лучше вариант получить double из входящих двоичных данных.

Другие вопросы по тегам