我正在尝试将通过其他应用程序提供的一些十六进制字符串转换为正确的DateTime值,但是无论我如何尝试,该值始终是错误的。十六进制字符串来自多个系统的ShutdownTime注册表项,读取时它们由不同的应用程序转换为十六进制。
这是我尝试过的代码:
$shutdownkey = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Windows\' -Name ShutdownTime
$bitconverted = [DateTime]::FromFileTime([System.BitConverter]::ToInt64($shutdownkey.ShutdownTime, 0))
$hextime = "C11E6DF46024D101"
$test = [DateTime]::FromFileTime([Convert]::ToInt64($hextime, 16))
因此,当我使用自己的ShutdownTime键时,但是当我使用后两个或以下任意一项时,前两行正常工作:
C9520B970A69D101
0A44A6EA3300D101
C11E6DF46024D101
它要么失败,要么给我一个不可能的时间戳。但是,如果我使用DCode之类的工具,它将成功以“Windows:64位十六进制值-Little Endian”的解码格式将其转换。从我在多个地方阅读的内容来看,.NET使用的是低端字节序,因此编码不应该成为问题,但我怀疑是这样。
谁能帮我弄清楚如何解决此转换问题?我不知为什么无法解决这个问题。
最佳答案
字节顺序落后。时间应该倒转。例如:
C9520B970A69D101 should be 01D1690A970B52C9
[DateTime]::FromFileTime(0x01D1690A970B52C9) gives (Tuesday, February 16, 2016 4:37:17 PM)