यह मायने रखता है। आप चाहते हैं कि आपकी तुलना का परिणाम SQL सर्वर की तुलना के समान हो। SQL सर्वर बाइनरी प्रकारों पर अहस्ताक्षरित तुलनाओं का उपयोग करता है:
select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
अगर आप long
. के साथ भी ऐसा ही करते हैं जिस पर हस्ताक्षर किया गया है, 0xFFFFFFFFFFFFFFFF
-1
. का प्रतिनिधित्व करता है . इसका मतलब है कि आपकी तुलना गलत होगी; यह SQL सर्वर में की गई समान तुलना से मेल नहीं खाएगा।
आप जो निश्चित रूप से चाहते हैं वह है ulong
. का उपयोग करना जहां 0xFFFFFFFFFFFFFFFF
है ulong.MaxValue
।
एंडियननेस भी महत्वपूर्ण है
इसके अतिरिक्त, जैसा कि मार्क ने बताया, BitConverter.GetUInt64
ठीक से परिवर्तित नहीं हो रहा है। मार्क पूरी तरह से सही नहीं है - BitConverter
यह जिस सिस्टम पर चल रहा है उसके आधार पर या तो बड़ा-एंडियन या छोटा-एंडियन है। आप इसे स्वयं देख सकते हैं
. इसके अलावा, भले ही बिटकॉन्टर हमेशा छोटे-एंडियन था, Array.Reverse
ढेर आवंटन और बाइट-बाय-बाइट प्रतिलिपि के साथ कम प्रदर्शनकारी है। BitConverter
शब्दार्थ या व्यावहारिक रूप से नौकरी के लिए सही उपकरण नहीं है।
आप यही चाहते हैं:
static ulong BigEndianToUInt64(byte[] bigEndianBinary)
{
return ((ulong)bigEndianBinary[0] << 56) |
((ulong)bigEndianBinary[1] << 48) |
((ulong)bigEndianBinary[2] << 40) |
((ulong)bigEndianBinary[3] << 32) |
((ulong)bigEndianBinary[4] << 24) |
((ulong)bigEndianBinary[5] << 16) |
((ulong)bigEndianBinary[6] << 8) |
bigEndianBinary[7];
}
सबसे साफ समाधान
अपडेट करें :यदि आप .NET Core 2.1 या बाद के संस्करण (या .NET मानक 2.1) का उपयोग करते हैं, तो आप BinaryPrimitives.ReadUInt64BigEndian
जो एकदम फिट है।
.NET फ्रेमवर्क पर, मेरे द्वारा उपयोग किया जाने वाला समाधान है:Timestamp.cs
. मूल रूप से एक बार जब आप Timestamp
पर डाल देते हैं , आप गलत नहीं हो सकते।