我有一些以TAI64N格式命名的文件,这里是一个参考。当我尝试使用这个源时,它在BitConverter.ToInt64
static void Main ( string[] args ) {
string[] filenames = new string[4]{
"4000000057b23bf30017a4bc",
"4000000057b23ef61dedacac",
"4000000057b24b1c2bab0614",
"4000000057b24ca521a230fc"
};
foreach (string filename in filenames) {
byte[] hexToBytes = StringToByteArray(filename);
long bytesToLong = BitConverter.ToInt64(hexToBytes, 0);
Console.WriteLine(bytesToLong); // Negative?
DateTime longToDateTime = new DateTime(bytesToLong);
}
}
public static byte[] StringToByteArray ( string hex ) {
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
我做错了什么?
您是否考虑过您的TAI64N值和您的处理器的端内酯之间的差异?我假设您使用的是x86-64处理器,它是小端序,而TAI64N值是大端序。BitConverter
类的方法使用处理器端序来转换值(见备注部分)。
我建议你试着反转数组中的字节顺序:
public static byte[] StringToByteArray ( string hex ) {
byte[] arr = Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
Array.Reverse(arr);
return arr;
}
随后long bytesToLong = BitConverter.ToInt64(hexToBytes, 4);
顺便说一下,我注意到您使用new DateTime(long ticks)
构造函数(参考),但您提供了秒(根据TAI64N规范)而不是ticks。