我有许多以TAI64N格式here is a reference命名的文件。在BitConverter.ToInt64的帮助下,当我尝试使用这个source时,结果是否定的
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();
}我做错了什么?
发布于 2016-08-17 19:47:20
您是否考虑过TAI64N值的endiannes与处理器之间的差异?我假设您使用的是x86-64处理器,它是小端的,而TAI64N值是大端的。BitConverter类的方法使用处理器字符顺序来转换值(see Remarks section。
我建议您尝试颠倒数组中的字节顺序:
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)构造函数(reference,但是你给它提供了秒数(根据TAI64N规范),而不是节拍。
https://stackoverflow.com/questions/38987385
复制相似问题