2012-10-17 16 views
5

मेरे पास एक सी प्रोग्राम है, मैं एक विशेष आदेश Eg.0x00000001 में 32 बिट संदेश भेजना चाहता हूं।आउटपुट ऐसा क्यों दिखता है?

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdint.h> 

struct test 
{ 
    uint16_t a; 
    uint16_t b; 
}; 

int main(int argc, char const *argv[]) 
{ 
    char buf[4]; 
    struct test* ptr=(struct test*)buf; 
    ptr->a=0x0000; 
    ptr->b=0x0001; 
    printf("%x %x\n",buf[0],buf[1]); //output is 0 0 
    printf("%x %x\n",buf[2],buf[3]); //output is 1 0 
    return 0; 
} 

फिर मैं चार सरणी में मानों को मुद्रित करके इसका परीक्षण करता हूं। मुझे उपरोक्त टिप्पणियों में आउटपुट मिला। आउटपुट 0 0 और 0 1 नहीं होना चाहिए? चूंकि लेकिन [3] आखिरी बाइट है? क्या मुझे कुछ याद आया है?

धन्यवाद!

उत्तर

7

इसके छोटे एंडियन का कारण बनें। इस पढ़ें: Endianness

उन्हें नेटवर्क के क्रम में अनुवाद करने के लिए, आप htonl (मेजबान करने वाली नेटवर्क के लंबे) और htons (मेजबान करने वाली नेटवर्क-कम) का अनुवाद कार्यों का उपयोग करने के लिए है। प्राप्त करने के बाद, आपको नेटवर्क से होस्ट ऑर्डर में कनवर्ट करने के लिए ntohl और ntohs फ़ंक्शंस का उपयोग करने की आवश्यकता है। सरणी में आपके बाइट्स को व्यवस्थित करने के क्रम पर निर्भर करता है कि आपने उन्हें स्मृति में कैसे रखा है। यदि आप उन्हें चार अलग-अलग छोटे बाइट्स के रूप में रखते हैं, तो आप अंतहीनता रूपांतरण को छोड़ देंगे। आप char इस प्रकार के कच्चे बाइट्स मैनिपुलेशन के लिए उपयोग कर सकते हैं।

+0

तो संदेश भेजता है जब मैं socket.h से sendto() का उपयोग करके भेजता हूं? यह 0x00000001 या 0x00000100 होगा? – kun

+0

@cjk: आपको भेजने के लिए 'htons' का उपयोग करने की आवश्यकता है, यह आपके लिए सटीक अंतहीनता जानने के लिए स्पेयर करता है। – Vlad

0

के रूप में विंडोज के रूप में डेटा रखता है "छोटे endian" इतनी बाइट्स उलट कर रहे हैं। अधिक जानकारी के लिए Endiannes देखें।

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