TAI64N to DateTime



我有一些以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

相关内容

  • 没有找到相关文章

最新更新