From 140711b5b642d454fe3e0134ff5cb4c9fc5c93e0 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 15 Sep 2016 01:54:13 +0100 Subject: [PATCH] * DiscImageChef.Helpers/StringHandlers.cs: Adds support for OSTA Compressed Unicode. * DiscImageChef.Helpers/DateHandlers.cs: Adds support for timestamps in ECMA-167 format. --- DateHandlers.cs | 26 ++++++++++++++++++++++++++ StringHandlers.cs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/DateHandlers.cs b/DateHandlers.cs index e634e713d..2a0e5fd5b 100644 --- a/DateHandlers.cs +++ b/DateHandlers.cs @@ -198,6 +198,32 @@ namespace DiscImageChef { return AppleDoubleEpoch.AddSeconds(AppleDoubleTimeStamp); } + + public static DateTime ECMAToDateTime(ushort typeAndTimeZone, short year, byte month, byte day, byte hour, byte minute, byte second, byte centiseconds, byte hundredsOfMicroseconds, byte microseconds) + { + byte specification = (byte)((typeAndTimeZone & 0xF000) >> 12); + long ticks = (long)centiseconds * 100000 + (long)hundredsOfMicroseconds * 1000 + (long)microseconds * 10; + if(specification == 0) + return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc).AddTicks(ticks); + + ushort preOffset = (ushort)(typeAndTimeZone & 0xFFF); + short offset; + + if((preOffset & 0x800) == 0x800) + { + offset = (short)(preOffset | 0xF000); + } + else + offset = (short)(preOffset & 0x7FF); + + if(offset == -2047) + return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Unspecified).AddTicks(ticks); + + if(offset < -1440 || offset > 1440) + offset = 0; + + return new DateTimeOffset(year, month, day, hour, minute, second, new TimeSpan(0, offset, 0)).AddTicks(ticks).DateTime; + } } } diff --git a/StringHandlers.cs b/StringHandlers.cs index 2e43fb5bb..a17a2acbe 100644 --- a/StringHandlers.cs +++ b/StringHandlers.cs @@ -118,6 +118,40 @@ namespace DiscImageChef return length == 0 ? "" : Encoding.ASCII.GetString(SpacePaddedString, 0, length); } + + /// + /// Converts an OSTA compressed unicode byte array to a C# string + /// + /// The C# string. + /// OSTA compressed unicode byte array. + public static string DecompressUnicode(byte[] dstring) + { + ushort unicode; + byte compId = dstring[0]; + string temp = ""; + + if(compId != 8 && compId != 16) + return null; + + for(int byteIndex = 1; byteIndex < dstring.Length;) + { + if(compId == 16) + unicode = (ushort)(dstring[byteIndex++] << 8); + else + unicode = 0; + + if(byteIndex < dstring.Length) + unicode |= dstring[byteIndex++]; + + if(unicode == 0) + break; + + temp += Encoding.Unicode.GetString(System.BitConverter.GetBytes(unicode)); + } + + return temp; + } + } }