2009-03-20 14 views
6

मेरे पास पुराने डेटा प्रारूप के लिए डेटटाइम संरचना है जिसके लिए मेरे पास किसी भी चश्मा तक पहुंच नहीं है। एक ऐसा क्षेत्र है जो डेटा के डेटाटाइम को इंगित करता है, लेकिन यह किसी भी प्रारूप में नहीं है जिसे मैं पहचानता हूं। ऐसा लगता है कि यह 32-बिट पूर्णांक के रूप में संग्रहीत किया जाता है, जो प्रत्येक दिन 20 तक बढ़ता है। क्या किसी ने कभी इस तरह कुछ चलाया है?यह डेटाटाइम प्रारूप क्या है?

संपादित करें:

उदाहरण: १०८८६३१९३६ दिसम्बर = 80 34 ई 3 40 00 00 00 00 हेक्स = 09/07/2007

संपादित करें:

पहले, देरी के लिए खेद है। मैंने सप्ताहांत में सामान करने की उम्मीद की थी, लेकिन वह असमर्थ था।

दूसरा, यह दिनांक प्रारूप प्रारंभिक रूप से सोचा जाने की तुलना में कमजोर है। ऐसा लगता है कि यह कुछ प्रकार की घातीय या लॉगरिदमिक विधि है, क्योंकि तिथियां बढ़ती दर में नहीं बदलती हैं।

तीसरा, इन मानों को समझने के लिए मेरे पास निष्क्रिय कार्य केवल दिनांक भाग दिखाता है, इसलिए मुझे नहीं पता कि समय का हिस्सा क्या है।

उदाहरण डेटा: (हेक्स मूल्यों बड़े endian, खजूर हैं dd/mm/yyyy)

0x40000000 = 1900/01/01
0x40010000 = 1900/01/01
0x40020000 = 01/01/1900
0x40030000 = 1900/01/01
0x40040000 = 1900/01/01
0x40050000 = 1900/01/01
0x40060000 = 1900/01/01
0x40070000 = 1900/01/01
+०१२३५१६४१०६१0x40080000 = 1900/01/02
0x40090000 = 1900/01/02
0x400A0000 = 1900/01/02
0x400B0000 = 1900/01/02
0x400C0000 = 1900/01/02
0x400D0000 = 01/02/1900
0x400E0000 = 1900/01/02
0x400F0000 = 1900/01/02
0x40100000 = 1900/01/03
0x40110000 = 1900/01/03
0x40120000 = 1900/01/03
0x40130000 = 01/03/1900
0x40140000 = 1900/01/04
0x40150000 = 1900/01/04
0x40160000 = 1900/01/04
0x40170000 = 1900/01/04
0x40180000 = 1900/01/05
0x40190000 = 01/05/1900
0x401A0000 = 1900/01/05
0x401B0000 = 1900/01/05
0x401C0000 = 1900/01/06
0x401D0000 = 1900/01/06
0x401E0000 = 1900/01/06
0x401F0000 = 01/06/1900
0x40200000 = 1900/01/07
0x40210000 = 1900/01/07
0x40220000 = 1900/01/08
0x40230000 = 1900/01/08
....
0x40800000 = 05/26/1901
0x40810000 = 1901/06/27
0x40820000 = 1901/07/29
....
0x40D00000 = 1944/11/08
0x40D10000 = 08/29/1947

संपादित करें: आखिर में मैंने इसे समझ लिया, लेकिन चूंकि मैंने पहले से ही बक्षीस के लिए अंक छोड़ दिए हैं, इसलिए अगर कोई इसे शॉट देना चाहता है तो मैं समाधान पर रोक लगा दूंगा।

बीटीडब्ल्यू, इसमें कोई समय घटक नहीं है, यह पूरी तरह से तारीखों को संग्रहीत करने के लिए है।

+0

क्या आप डेटा प्रारूप के बारे में * कुछ * जानते हैं, जैसे किसी संबंधित प्रोग्राम का नाम? –

+0

या शायद एक उदाहरण शामिल करें? –

+0

क्षमा करें, आपका उदाहरण मुझे कोई समझ नहीं आता है। आपका मतलब "डीईसी =" और "ओसीटी =" से क्या है और वे विभिन्न प्रकारों के बराबर क्यों हैं? –

उत्तर

7

यह पूर्णांक नहीं है, यह 32 बिट फ़्लोटिंग पॉइंट नंबर है। मैंने अभी तक प्रारूप को काफी काम नहीं किया है, यह आईईईई नहीं है।

संपादित करें: इसे मिला।1 बिट साइन, 0x3ff के ऑफसेट के साथ 11 बिट एक्सपोनेंट, और बाईं ओर एक अंतर्निहित बिट के साथ 20 बिट मंटिसा। सी में, सकारात्मक संख्या संभालने केवल:

double offset = pow(2, (i >> 20) - 0x3ff) * (((i & 0xfffff) + 0x100000)/(double) 0x100000); 

यह पैदावार 0x40000000 = 2.0, इसलिए प्रारंभ दिनांक 1899/12/30 होना चाहिए।

फिर से संपादित करें: क्योंकि आप मेरे उत्तर को स्वीकार करने के लिए बहुत दयालु थे, और आप गति के बारे में चिंतित हैं, मैंने सोचा कि मैं इसे थोड़ा परिष्कृत कर दूंगा। आपको वास्तविक संख्या के आंशिक भाग की आवश्यकता नहीं है, इसलिए हम केवल bitwise संचालन का उपयोग करके सीधे पूर्णांक में परिवर्तित कर सकते हैं। इस समय पायथन में, परीक्षण परिणामों के साथ पूरा करें। मैंने बेहतर पठनीयता के लिए कुछ मध्यवर्ती मूल्यों को शामिल किया है। कोई ऋणात्मक संख्या के प्रतिबंध के अलावा, इस संस्करण में समस्याएं हो सकती हैं जब एक्सपोनेंट 1 9 वर्ष से अधिक हो जाता है, लेकिन यह आपको 3335 तक अच्छा रखेगा।

>>> def IntFromReal32(i): 
     exponent = (i >> 20) - 0x3ff 
     mantissa = (i & 0xfffff) + 0x100000 
     return mantissa >> (20 - exponent) 

>>> testdata = range(0x40000000,0x40240000,0x10000) + range(0x40800000,0x40830000,0x10000) + [1088631936] 
>>> from datetime import date,timedelta 
>>> for i in testdata: 
     print "0x%08x" % i, date(1899,12,30) + timedelta(IntFromReal32(i)) 


0x40000000 1900-01-01 
0x40010000 1900-01-01 
0x40020000 1900-01-01 
0x40030000 1900-01-01 
0x40040000 1900-01-01 
0x40050000 1900-01-01 
0x40060000 1900-01-01 
0x40070000 1900-01-01 
0x40080000 1900-01-02 
0x40090000 1900-01-02 
0x400a0000 1900-01-02 
0x400b0000 1900-01-02 
0x400c0000 1900-01-02 
0x400d0000 1900-01-02 
0x400e0000 1900-01-02 
0x400f0000 1900-01-02 
0x40100000 1900-01-03 
0x40110000 1900-01-03 
0x40120000 1900-01-03 
0x40130000 1900-01-03 
0x40140000 1900-01-04 
0x40150000 1900-01-04 
0x40160000 1900-01-04 
0x40170000 1900-01-04 
0x40180000 1900-01-05 
0x40190000 1900-01-05 
0x401a0000 1900-01-05 
0x401b0000 1900-01-05 
0x401c0000 1900-01-06 
0x401d0000 1900-01-06 
0x401e0000 1900-01-06 
0x401f0000 1900-01-06 
0x40200000 1900-01-07 
0x40210000 1900-01-07 
0x40220000 1900-01-08 
0x40230000 1900-01-08 
0x40800000 1901-05-26 
0x40810000 1901-06-27 
0x40820000 1901-07-29 
0x40e33480 2007-09-07 
+0

क्या 0x40220000 -> 01/06/1900 नहीं देगा? – mbeckish

+0

नहीं, यह सही है। 0x40220000 = 9.0, 12/30/1899 में जोड़ें 12/39/1899 देता है; 31 दिन घटाएं और महीने ले जाएं, आपको 1/08/1900 छोड़ देता है। –

+0

ठीक है। आपका जवाब न केवल सही है, यह जिस तरह से मैं कर रहा था उससे काफी तेज़ है। एक उपहार है। – Kevin

3

क्या आप वाकई 09/07/2007 के अनुरूप हैं?

मैं पूछता हूं क्योंकि 1088631936 लिनक्स (एट अल) शून्य दिनांक: 01/01/1970 00:00:00 से 06/30/2004 21:45:36 के बाद सेकंड की संख्या है।

मुझे लगता है कि यह सामान्य शून्य तिथि के बाद मान सेकेंड हैं।

संपादित करें: मुझे पता है कि यह सही उत्तर नहीं है इसके लिए यह बहुत संभव है। यह सिर्फ एक दृष्टिकोण है (वैध एक) लेकिन मुझे लगता है कि अधिक जानकारी की आवश्यकता है (टिप्पणियां देखें)। किसी और की आशा में जवाब देने या विचार देने के लिए इस सवाल को सामने लाने के लिए इसे फिर से संपादित करना। मी: निष्पक्षता, खेलकूद और साझा करने की भावना के साथ: डी

1

मैं कहूंगा कि vmarquez करीब है। वे हेक्स में हैं

In [8]: time.strftime("%s", (2009, 3, 21, 1, 1, 0, 0,0,0)) 
Out[8]: '1237590060' 

In [9]: time.strftime("%s", (2009, 3, 22, 1, 1, 0, 0,0,0)) 
Out[9]: '1237676460' 

और यहाँ:

In [10]: print("%0x %0x" % (1237590060, 1237676460)) 
49c4202c 49c571ac 

आप केवल पहले 5 अंक लेते हैं

यहाँ दिनांकों 2009/03/21 और 2009/03/22 यूनिक्स epochtime के रूप में कर रहे हैं , विकास 21 है। किस प्रकार आपके प्रारूप से मेल खाता है, नकारात्मक?

+0

धन्यवाद पासी। गणित सरल, साफ और विवरण के बहुत करीब हैं। मुझे आश्चर्य होता है कि "दिन में 20 से बढ़ोतरी" सटीक है या "20-दर-दिन" जैसी है। वैसे भी, हम युग की समस्या के साथ छोड़ दिया गया है (शून्य तारीख क्या है?)। – vmarquez

1

कुछ संदर्भ उपयोगी होंगे। यदि आपकी डेटा फ़ाइल कुछ दिखती है, सचमुच या कम से कम रूप में, इस फ़ाइल की तरह, vmarquez पैसे पर है।

http://www.slac.stanford.edu/comp/net/bandwidth-tests/eventanalysis/all_100days_sep04/node1.niit.pk

कि संदर्भ उपलब्ध बैंडविड्थ आकलन उपकरण (ABwE) द्वारा उत्पादित डेटा है - उत्सुक आइटम है कि यह वास्तव रूप में अच्छी तरह होता है संदर्भ के रूप में है कि १०८८६३१९३६ मूल्य है। ऐसा उदाहरण


date  time  abw  xtr dbcap avabw avxtr avdbcap  rtt timestamp 
06/30/04 14:43:48 1.000 0.000 1.100 1.042 0.003 1.095 384.387 1088631828 
06/30/04 14:45:36 1.100 0.000 1.100 1.051 0.003 1.096 376.408 1088631936 
06/30/04 14:47:23 1.000 0.000 1.100 1.043 0.003 1.097 375.196 1088632043 
सुझाए गए 21:45:36 समय मान से सात घंटे का ऑफसेट लगता है। (शायद डेनलाइट बचत समय पर चल रहे स्टैनफोर्ड स्थानीय।)

+0

अब यह एक अच्छा खोज है! +1 – vmarquez

0

ठीक है, आपने केवल हमें दिखाया है कि आपका प्रोग्राम 8 अंकों में से 2 का उपयोग कैसे करता है, इसलिए हमें यह मानना ​​होगा कि अन्य 6 को अनदेखा किया गया है (क्योंकि आपका कार्यक्रम उन अन्य अंकों के साथ कुछ भी कर सकता है)।

तो, हम कह सकते हैं कि इनपुट प्रारूप है: 40mn0000 जहां एम और एन दो हेक्स अंक हैं।

फिर, उत्पादन होता है: 1900/01/01 + मंजिल ((2^(एम + 1) -2) + n * 2^(एम -3)) दिन

स्पष्टीकरण:

  1. प्रत्येक उदाहरण में, ध्यान दें कि 1 से बढ़ने से एन 2^(एम -3) द्वारा दिनों की संख्या बढ़ जाती है।
  2. ध्यान दें कि हर बार एन एफ से 0 तक जाता है, एम बढ़ता है।

इन दो नियमों का उपयोग करके, और संख्याओं के साथ खेलना, आपको ऊपर समीकरण मिलता है। (मंजिल के अलावा, जो जोड़ा गया था क्योंकि आउटपुट आंशिक दिनों प्रदर्शित नहीं करता है)।

मुझे लगता है कि आप दो अलग-अलग हेक्स चर एम और एन को एक 2-अंकों वाले हेक्स संख्या एच के साथ बदलकर इसे फिर से लिख सकते हैं। हालांकि, मुझे लगता है कि समीकरण बहुत अधिक उपयोगी होगा।

+0

बधाई हो रही है। आपके सूत्र की पुष्टि की। – vmarquez

+0

आपने मुझे दिए गए पहले उदाहरण को याद किया: 0x40E33480 = 09/07/2007 – Kevin

संबंधित मुद्दे