<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript Конвертирование даты из HEX в обычный формат]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=3326&amp;type=atom" />
	<updated>2009-06-25T06:05:41Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=3326</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript Конвертирование даты из HEX в обычный формат]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25215#p25215" />
			<content type="html"><![CDATA[<p>ну, я тоже не смог победить</p><p>в результате оказалось, что переводить в общем и не надо<br />можно сразу hex использовать:</p><div class="codebox"><pre><code>Function HexDateToDate(hDate)
    highPart = CDbl(&quot;&amp;h&quot; &amp; Left(hDate,8))
    lowPart = CDbl(&quot;&amp;h&quot; &amp; Right(hDate,8))
    intInstalledOn = highPart * (2^32) + lowPart 
    intInstalledOn = intInstalledOn / (60 * 10000000)
    intInstalledOn = intInstalledOn / 1440
    HexDateToDate = intInstalledOn + #1/1/1601#
End Function</code></pre></div><p>как легко понять, надо подавать ровно 16 знаков. У меня почему-то постоянно терялся первый нолик, поэтому я просто добивал слева нулями до тех пор, пока 16 символов не получалось</p><div class="codebox"><pre><code>function ReadHexDataRegValues (RegRoot, RegValue)
    CurrentValue = WSHShell.RegRead(RegRoot &amp; &quot;\&quot; &amp; RegValue)
    For I = LBound(CurrentValue) To UBound(CurrentValue)
        tmphex = CStr(Hex(CurrentValue(I)))
        if Len(tmphex)=1 then tmphex = &quot;0&quot; &amp; tmphex
        hexstr = tmphex &amp; hexstr
    Next
    
    While Len(hexstr) &lt;16
        hexstr = &quot;0&quot; &amp; hexstr
    Wend
    ReadHexDataRegValues = HexDateToDate(hexstr)
End Function</code></pre></div><p>наверняка можно было сделать и куда красивее, но мне важнее была скорость (в смысле чтобы скриптом можно было пользоваться быстрее)</p>]]></content>
			<author>
				<name><![CDATA[Alexx_B]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3858</uri>
			</author>
			<updated>2009-06-25T06:05:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25215#p25215</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript Конвертирование даты из HEX в обычный формат]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25211#p25211" />
			<content type="html"><![CDATA[<p><strong>Alexx_B</strong>, у меня, увы, никак не получилось конвертировать полученный&nbsp; из параметра REG_BINARY массив (представляющее то самое шестнадцатирично-десятичное значение Int64) в строку десятичных символов. Вы-то сие как делали?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-06-24T23:06:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25211#p25211</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript Конвертирование даты из HEX в обычный формат]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25160#p25160" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Для работы с этой структурой можно пользовать WMI, а конкретно — объект SWbemDateTime:</p></blockquote></div><p>спасибо! это именно то, что надо</p><div class="quotebox"><blockquote><p>Я у себя такого параметра не нашёл. Выложите сюда файл реестра с этим параметром, я тоже погляжу на возможные преобразования из значения реестра в строку</p></blockquote></div><p>это от ntbackup, если запланированы задания<br />но я привел это лишь как пример, что подобная кодировка используется в самой винде. Думаю, если поискать в реестре, то можно еще встретить подобные варианты записи даты</p><p>В моем же случае я искал способ конвертации значения параметра ServiceStartTimeFT и VirusDefinitionDateFileTime. Это значение от программы Symantec Mail Security, просто я предположил, что продукт более редкий, чем сама винда. <br />А вот вариант кодирования тот же</p><p>Если интересно - могу и поделиться, мне не жалко <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><div class="codebox"><pre><code>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\SMSMSE\6.0\Server\Stats\ServerInfo]
&quot;ServerNameStr&quot;=&quot;server&quot;
&quot;ServiceStartTimeFT&quot;=hex:70,05,a0,27,9b,ca,c9,01
&quot;ExchangeServiceStateBool&quot;=dword:00000000
&quot;AutoProtectionStateEnum&quot;=dword:00000002
&quot;VirusScanningStateBool&quot;=dword:00000001
&quot;MailboxStoreTotalDword&quot;=dword:00000000
&quot;MailboxStoreMountedDword&quot;=dword:00000000
&quot;PublicFolderStoreTotalIDDword&quot;=dword:00000000
&quot;PublicFolderStoreMountedDword&quot;=dword:00000000
&quot;AutoProtectPolicyIDDword&quot;=dword:00000000
&quot;AutoProtectPolicyNameStr&quot;=&quot;Standard&quot;
&quot;StandardVirusPolicyActionEnum&quot;=dword:00000003
&quot;TotalVirusDefinitionCount&quot;=dword:0000941d
&quot;VirusDefinitionVersionUint&quot;=dword:00000002
&quot;VirusDefinitionDateFileTime&quot;=hex:20,8e,b4,62,cc,f2,c9,01</code></pre></div><div class="quotebox"><blockquote><p>это называется LittleEndian Number</p></blockquote></div><p>спасибо, буду знать <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><div class="quotebox"><blockquote><p>Спасибо. Ваше исследование очень полезно и может помочь.</p></blockquote></div><p>не за что <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>не буду присваивать себе все лавры - на самом деле объяснение этому я нашел на сайте MS<br />http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/b7fa5f6b-df8e-49fe-9b25-a0c6e3ac9dc5</p><p>но там решение было на VB, и решение:<br /></p><div class="codebox"><pre><code>DateTime.FromFileTimeUtc</code></pre></div><p>не подошло</p><p>но сам принцип я понял именно оттуда</p>]]></content>
			<author>
				<name><![CDATA[Alexx_B]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3858</uri>
			</author>
			<updated>2009-06-24T05:55:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25160#p25160</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript Конвертирование даты из HEX в обычный формат]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25153#p25153" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>01c9ca9b27a00570, да, младшее число становится старшим</p></blockquote></div><p>это называется LittleEndian Number. Почитать об этом можно здусь <a href="http://en.wikipedia.org/wiki/Endianness">http://en.wikipedia.org/wiki/Endianness</a></p><div class="quotebox"><blockquote><p>Это WinNT time, из него можно получить нормальную дату</p></blockquote></div><p>Это очень разочаровывает. MS как всегда впереди планеты всей и пытается изобрести нечто собственное. Timestamp тоже может показаться не самым удобным представлением, но оно все-таки привычное уже на протяжении почти 40 лет.</p><p>Спасибо. Ваше исследование очень полезно и может помочь.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2009-06-23T15:01:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25153#p25153</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript Конвертирование даты из HEX в обычный формат]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25152#p25152" />
			<content type="html"><![CDATA[<p>Вы путаете. getLast — функция, использовавшаяся в контексте перевода 8-байтной структуры <a href="http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx">FILETIME</a> (параметр «last») в тип VarDate.</p><p>Для работы с этой структурой можно пользовать WMI, а конкретно — объект <a href="http://msdn.microsoft.com/en-us/library/aa393687.aspx">SWbemDateTime</a>:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objSWbemDateTime
Dim strFILETIME

Set objSWbemDateTime = WScript.CreateObject(&quot;WbemScripting.SWbemDateTime&quot;)

strFILETIME = &quot;128856832090310000&quot;

With objSWbemDateTime
    .SetFileTime strFILETIME, True
    WScript.Echo .GetVarDate
End With

Set objSWbemDateTime = Nothing

WScript.Quit 0</code></pre></div><p>Я у себя такого параметра не нашёл. Выложите сюда файл реестра с этим параметром, я тоже погляжу на возможные преобразования из значения реестра в строку.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-06-23T14:51:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25152#p25152</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript Конвертирование даты из HEX в обычный формат]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25150#p25150" />
			<content type="html"><![CDATA[<p>Столкнулся с такой проблемой. Многие программы хранят в реестре какую-то дату в виде HEX. В частности, у меня сейчас проблемы с симантеком, но даже сама винда часто так поступает (например, HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsBackup\Status, параметр Last Success)</p><p>И вот вижу я что-то типа 70 05 A0 27 9B CA C9 01 и знаю, что это 01.05.2009 20:26:49</p><p>Собственно, наполовину проблему я решил, т.к. алгоритм преобразования я нашел (может, кому пригодится)<br />Это т.н. FileTime, поступаем следующим образом - получаем HEX-число (01c9ca9b27a00570, да, младшее число становится старшим), потом переводим это в DEC (получаем 128856832090310000). Это WinNT time, из него можно получить нормальную дату (в частности, с помощью команды w32tm.exe /ntte 128856832090310000)</p><p>HEX-число я получаю (естественно, как стринг), для преобразования обычного DEC-числа в дату на этом же форуме я нашел замечательную функцию (из темы про получение времени последнего логина пользователей)</p><div class="codebox"><pre><code>Function getLast( last )
    Dim intLastLogonTime
    intLastLogonTime = last.HighPart * (2^32) + last.LowPart
    intLastLogonTime = intLastLogonTime / (60 * 10000000)
    intLastLogonTime = intLastLogonTime / 1440
    if intLastLogonTime &lt;&gt; 0 then intLastLogonTime = intLastLogonTime + #1/1/1601#
    getLast = intLastLogonTime
End Function</code></pre></div><p>так что затык только один - пробросить мостик между имеющимся у меня HEX и требуемым для getLast десятичным числом</p><p>попробовал поискать готовую функцию перевода HEX to DEC, но все они возвращают число типа Double вида <br />1.2885683209031E+17 и getLast это не понимает <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>Понимаю, что проблема звучит смешной, но функцию getLast я не понимаю и потому преобразовать число в понятный для ее работы вид не могу...</p>]]></content>
			<author>
				<name><![CDATA[Alexx_B]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3858</uri>
			</author>
			<updated>2009-06-23T13:42:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25150#p25150</id>
		</entry>
</feed>
