Due to the difficulties that I faced with calling the DotNetOAuth CryptoKey constructor, I started exploring the .Net System.DateTime structure. According to what I read, this object is actually a 64-bit signed integer with โTicksโ encoded in the lower 62 bits, and Kind encoded in the upper 2 bits (IOW, this is a concatenation of 2-bit Good and 62- bit tics).
Now I wanted to actually โseeโ this, so I built a small C # program that created three System.DateTime objects:
DateTime dtUtc = new System.DateTime(2014, 4, 29, 9, 10, 30, System.DateTimeKind.Utc);
DateTime dtLocal = new System.DateTime(2014, 4, 29, 9, 10, 30, System.DateTimeKind.Local);
DateTime dtU = new System.DateTime(2014, 4, 29, 9, 10, 30, System.DateTimeKind.Unspecified);
Then I reset the ticks property for each and, as expected, they were all equal. Finally, I applied .ToBinary ()
long bitUtc = dtUtc.ToBinary();
long bitLocal = dtLocal.ToBinary();
long bitU = dtU.ToBinary();
These debts were different, as expected. HOWEVER, I then tried to โcheckโ the upper two bits to see which state corresponds to which settings, and found that the upper two bits were the same in all three. I used the following procedure to return the state of the bit:
public static bool IsBitSet<T>(this T t, int pos) where T : struct, IConvertible
{
var value = t.ToInt64(CultureInfo.CurrentCulture);
return (value & (1 << pos)) != 0;
}
(I got this from another post in SO) and named it like this:
Boolean firstUtc = Class1.IsBitSet<long>(bitUtc, 63);
Boolean secondUtc = Class1.IsBitSet<long>(bitUtc, 62);
Boolean firstLocal = Class1.IsBitSet<long>(bitLocal, 63);
Boolean secondLocal = Class1.IsBitSet<long>(bitLocal, 62);
Boolean firstU = Class1.IsBitSet<long>(bitU, 63);
Boolean secondU = Class1.IsBitSet<long>(bitU, 62);
Again, the first and second bits were set the same in all three (first it was true, second false). I do not understand this, since I THINK that they will all be different, which corresponds to different values โโof SystemKind.
Finally, I read a little more and found (or at least it was said in one source) that MS does not serialize type information in .ToBinary (). Ok, but then why are the outputs of the .ToBinary () method all different?
, , , .