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;
+ }
+
}
}