c++ - data - डेटा टाइप क्या है




कैसे 64bit लंबी डेटा टाइप करने के लिए 16bit डेटा प्रकार के लिए (3)

मैं जानना चाहूंगा कि किसी भी 16 bit डेटा प्रकार में 64 bit long डेटा प्रकार कैसे परिवर्तित करें। टाइम स्टाम्प को शामिल करने के लिए ईथरनेट अनुप्रयोग में यह सुविधा आवश्यक है। टाइम स्टैम्प को शामिल करने के लिए केवल 2 बाइट्स ( 16 बिट्स ) उपलब्ध हैं। लेकिन हम Win API से टाइम स्टाम्प मान के रूप में 64 bit long समय 64 bit long प्राप्त कर रहे हैं। तो 64 बिट डेटा प्रकार से 16 बिट डेटा प्रकार के लिए रूपांतरण आवश्यक है


आपके लिए टाइमस्टैम्प की आवश्यकता के आधार पर 16 बिट्स या पर्याप्त नहीं हो सकते हैं। अधिकांश उद्देश्यों के लिए यह बहुत छोटा या कम से कम असुविधाजनक है लेकिन कुछ उदाहरण जहां यह काम कर सकता है: टाइमआउट, पैकेट के लिए राउंड-ट्रिप समय को मापने, समय अंतराल को पूरी तरह से मापने (जो उपयोगकर्ताओं को समय की जानकारी प्रदर्शित करने के लिए ठीक काम कर सकते हैं) और इसी तरह।

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


जैसा कि दूसरों ने कहा, पहली समस्या सही स्केलिंग पर निर्णय ले रही है। आपको अधिकतम रेंज की आवश्यकता के साथ अपने रिज़ॉल्यूशन को संतुलित करना होगा। इसके बारे में सोचने का एक तरीका यह तय करना है कि प्रति बिट कितने सेकेंड्स चाहिए। 1 सेकंड प्रति बिट के साथ आप 1 सेकंड से 65536 सेकंड तक या ~ 1000 मिनट तक मूल्यों को व्यक्त कर सकते हैं। 1 मिलीसेकंड प्रति बिट आपको 0.001 सेकंड से 65.5 सेकंड तक जाने देता है

यहां रूपांतरण करने का एक तरीका है

#define seconds_per_bit   .0001  <--YOUR VALUE HERE.
#define bits_per_second   (1/seconds_per_bit);  
int16 timestamp()
{
  Int64 counts_per_second,counts;

  QueryPerformanceFrequency(&counts_per_sec);
  QueryPerformanceCounter(&counts);  
  return (UInt16)(counts * bits_per_second / counts_per_second);
}

यह आपके लिए टाइमस्टैम्प का उपयोग करने पर पूरी तरह निर्भर करता है। आप ईथरनेट का उल्लेख करते हैं, इसलिए एक स्पष्ट उपयोग मैं सोच सकता था कि पैकेट के आदेश के लिए। और उस मामले में आपको वास्तव में एक काउंटर चाहिए। आपके टाइमस्टैम्प के बजाय "यह पैकेट मई 14 पर 14:35 बजे भेजा गया", यह केवल "यह 4023 वां पैकेट है" कह सकता है।

यदि आपको वास्तविक घड़ी के समय को रिकॉर्ड करने की आवश्यकता है, तो आपको यह चुनना होगा कि यह कौन से भाग प्रासंगिक है। 16 बिट्स आपको 65536 मूल्य देते हैं जिनसे आप खेल सकते हैं। क्या आप चाहते हैं कि वे सेकंड का प्रतिनिधित्व करें? तब आपके टाइमस्टैम्प हर 18 घंटों के आसपास लपेटेंगे

या वे मिनट हो सकते हैं फिर वे चारों ओर लपेटे 45 दिन पहले होंगे। या दिन, या माइक्रोसॉन्ड्स, यह सब आप की जरूरत पर निर्भर करता है।

लेकिन एकमात्र तरीका है कि आप एक 64-बिट मान को 16-बिट में परिवर्तित कर सकते हैं 48 बिट्स डेटा को निकालना है। आप जो चुनते हैं





timestamp