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
из входящих двоичных данных.