2011-01-21 12 views
5
unsigned char *adata = (unsigned char*)malloc(500*sizeof(unsigned char)); 
unsigned char *single_char = adata+100; 

मैं 1.10 (int) के बीच मानों का प्रतिनिधित्व करने के लिए एकल_चर में पहले चार बिट्स कैसे बदलूं?बिना हस्ताक्षर किए गए चार में 4 बिट्स कैसे बदलें?

सवाल टीसीपी हेडर संरचना से आया था:

Data Offset: 4 bits 

The number of 32 bit words in the TCP Header. This indicates where 
the data begins. The TCP header (even one including options) is an 
integral number of 32 bits long. 

आमतौर पर यह 4..5 का मूल्य है, चार मूल्य 0xA0 की तरह है।

उत्तर

7

ये धारणा है कि आपने कुछ मूल्य के लिए * एकल_चर प्रारंभ किया है। अन्यथा समाधान कैफ पोस्ट करता है जो आपको चाहिए।

(*single_char) = ((*single_char) & 0xF0) | val;

  1. (*single_char) & 11110000 - रीसेट करता है करने के लिए 0
  2. | val कम 4 बिट्स - मूल्य के लिए पिछले 4 बिट्स सेट (यह मानते हुए वैल < 16)

यदि आप चाहते हैं पिछले 4 बिट्स तक पहुंचने के लिए आप unsigned char v = (*single_char) & 0x0F;

का उपयोग कर सकते हैं कहां उच्च 4 बिट्स तक पहुंचना चाहते हैं, आप केवल मास्क अप 4 यानी स्थानांतरित कर सकते हैं।

unsigned char v = (*single_char) & 0xF0;

और उन्हें स्थापित करने के लिए:

(*single_char) = ((*single_char) & 0x0F) | (val << 4);

+1

टीसीपी हेडर के विशिष्ट मामले में में किसी को मदद करता है, इस ओकटेट के निचले 4 बिट्स आरक्षित हैं और शून्य होना चाहिए। – caf

+1

आह ठीक है, तो आपका समाधान बेहतर है :) – GWW

+0

@GWW, अंत में, यह आपका समाधान था जो मेरे लिए काम करता था। लेकिन यह कभी-कभी अजीब मूल्य निर्धारित करता है .. (उदाहरण के लिए, एकल_char 0x80 के बजाय हेक्स 0x86 बन जाता है)। –

3

आप अलग-अलग बिट्स तक पहुंचने और अपनी आवश्यकताओं के अनुसार संशोधित करने के लिए bitwise operators का उपयोग कर सकते हैं।

6

इस डेटा की भरपाई के लिए *single_char के उच्च 4 बिट्स सेट हो जाएगा, और स्पष्ट कम 4 बिट्स:

unsigned data_offset = 5; /* Or whatever */ 

if (data_offset < 0x10) 
    *single_char = data_offset << 4; 
else 
    /* ERROR! */ 
+0

तो यह पहले 4 बिट्स को बदल देगा और वैसे भी कम बिट्स को प्रभावित नहीं करेगा? धन्यवाद! –

+0

@mhambra: "पहला" नोटेशन का विषय है - यह * सबसे महत्वपूर्ण * 4 बिट्स को बदल देगा, जो आप टीसीपी हेडर के उस क्षेत्र के लिए चाहते हैं। जैसा कि मैंने लिखा है, यह निचले 4 बिट्स को साफ़ करेगा (शून्य) - और यह वही है जो आप टीसीपी हेडर के लिए चाहते हैं, जहां कम 4 बिट्स आरक्षित हैं और शून्य होना चाहिए। – caf

2

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं नहीं चाहता कि दूसरों को एक func प्राप्त करने के लिए bitwise ऑपरेटरों पर लंबे लेख पढ़ने के लिए इन के समान tion -

//sets b as the first 4 bits of a(this is the one you asked for 
void set_h_c(unsigned char *a, unsigned char b) 
{ 
    (*a) = ((*a)&15) | (b<<4); 
} 

//sets b as the last 4 bits of a(extra) 
void set_l_c(unsigned char *a, unsigned char b) 
{ 
    (*a) = ((*a)&240) | b; 
} 

आशा है कि यह भविष्य

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