2011-12-13 12 views
13

मैं कुछ विरासत कोड के साथ काम कर रहा हूं और मैं एक ऐसे फ़ंक्शन में आया जो स्पष्ट रूप से एक मनमाने ढंग से लंबे क्षेत्र (नेटवर्क से अधिक बड़ा हो सकता है) पर नेटवर्क बाइट ऑर्डर रूपांतरण करने के लिए उपयोग किया जाता है।यह वास्तव में क्या करता है? - पागल सी ++ फ़ंक्शन

मैं यह बताने के लिए पर्याप्त रूप से पर्याप्त नहीं समझ सकता कि यह संदेश बफर रेंज पर बाइट ऑर्डर को वापस करने से कहीं ज्यादा कुछ कर रहा है (या भले ही यह विश्वसनीय रूप से करेगा)। क्या कोई मुझे इसे तोड़ने और इसका विश्लेषण करने में मदद कर सकता है ताकि मैं इसे किसी ऐसी चीज़ से बदल सकूं जो अधिक समझदार है (या कम से कम इसे अच्छी तरह से टिप्पणी करें) !?

void swapit(unsigned char *msg, int length) { 
    for(;length>0;length--, msg++) { 
    *msg = ((*msg * 0x0802LU & 0x22110LU) | 
      (*msg * 0x8020LU & 0x88440LU)) * 
      0x10101LU >> 16; 
    } 
} 
+3

http://stackoverflow.com/a/746203/367273 देखें जहां यह फ़ंक्शन कई विकल्पों के साथ दिखाई देता है। उस आधार पर बंद करने के लिए वोटिंग। – NPE

+0

एआरएम ... क्या मुझे इसे "यह पूरी तरह से सुरक्षित है और इसके बारे में चिंता न करें?" –

+1

यह आप पर निर्भर है। यह स्पष्ट रूप से एक टिप्पणी का हकदार है (और शायद उस अन्य SO प्रश्न का एक लिंक? :-)) – NPE

उत्तर

20

यह देखने के लिए कि यह कैसे काम करता है, बिट पैटर्न abcdefgh पर ऑपरेशन लागू करने पर विचार करें। मैं . के साथ 0 के लिए बाइनरी संख्याओं का प्रतिनिधित्व करूंगा, इसलिए गैर-शून्य बिट्स खड़े हो जाते हैं।

पहले उपसूचक है:

........ ........ abcdefgh 
* ........ ....1... ......1. (0x0802) 
= .....abc defgh..a bcdefgh. 
& ......1. ..1....1 ...1.... (0x22110) 
= ......b. ..f....a ...e.... 

पीछे नहीं है:

........ ........ abcdefgh 
* ........ 1....... ..1..... (0x8020) 
= .abcdefg h..abcde fgh..... 
& ....1... 1....1.. .1...... (0x88440) 
= ....d... h....c.. .g...... 

उन्हें संयोजन और अंतिम निरंतर से गुणा करने देता है:

......b. ..f....a ...e.... 
| ....d... h....c.. .g...... 
= ....d.b. h.f..c.a .g.e.... 
* .......1 .......1 .......1 (0x10101) 
= ....d.b. h.f..c.a .g.e.... 
+h.f..c.a .g.e.... ........ 
+.g.e.... ........ ........ 
= hgfedcba hgfe.c.a .g.e.... 

अंत में 16 बिट से नीचे स्थानांतरण hgfedcba देता है, मूल पैटर्न के विपरीत।

+0

विस्तृत उत्तर के लिए धन्यवाद, यह समझने में बहुत आसान बना दिया :) –

3

यह Reverse the bits in a byte with 7 operations (no 64-bit) के रूप में थोड़ा twiddling हैक्स में उल्लेख किया गया है।

+1

+1 बिट ट्विडलिंग हैक्स के संदर्भ के लिए +1! निश्चित रूप से यह जानने के लायक है कि आप कम- स्तर कोड –

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