2009-05-20 14 views
5

अगर मुझे पहले पूछा गया है तो मुझे माफ़ कर दो, लेकिन मैं आपको आश्वस्त करता हूं कि मैंने इंटरनेट को खराब कर दिया है और कुछ भी नहीं बदला है, शायद इसलिए कि मेरे पास सही शब्दावली नहीं है। (?)एन्कोडिंग ... कुछ प्रकार?

मैं एक पूर्णांक लेने के लिए और यह एक छोटे-endian कन्वर्ट करने के लिए चाहते हैं इस तरह हेक्स प्रतिनिधित्व:

303 -> 0x2f010000

मैं देख सकता हूँ कि बाइट्स है कि इस तरह से भरे होते हैं 16 और 1 के स्थान दोनों एक ही बाइट में हैं, और 4096 की जगह और 256 की जगह एक बाइट साझा करती है। अगर कोई मुझे इस तरह के एन्कोडिंग के लिए सही शब्दावली पर इंगित कर सकता है, तो मुझे यकीन है कि मुझे यह करने के तरीके पर मेरा जवाब मिल सकता है। धन्यवाद!

+0

क्या आप एक dec2hex जैसे फ़ंक्शन की तलाश में हैं? कई भाषाओं में दशमलव को हेक्साडेसिमल प्रतिनिधित्व में बदलने की सुविधा होती है। – Kekoa

+3

+1 संभवतः सोना पर मैंने कभी देखा है। :-) –

+0

सीधे हेक्स में कनवर्ट करना कोई समस्या नहीं है - उदाहरण के तौर पर, मैं एक हेक्स रूपांतरण के साथ 303 से 12f रूपांतरित कर सकता हूं। मुझे जो चाहिए वह एक बाइट का उपयोग करके एन्कोडिंग है जो हेक्स "स्थानों" की प्रत्येक जोड़ी को पकड़ने के लिए है, अगर यह समझ में आता है। – Blumer

उत्तर

2

उपयोग बिट पारी बिटवाइज़ के साथ संयुक्त ऑपरेटरों AND व OR ऑपरेटर ...

संभालने 32 बिट अहस्ताक्षरित:

int value = 303; 
int result = 0x00000000; 

for (int i = 0; i < 4; i++) 
{ 
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8))); 
} 
+0

धन्यवाद, डेमी। मुझे नहीं लगता कि यह काफी आवश्यक है जो मुझे चाहिए, लेकिन शायद अधिक क्योंकि मैंने पूरी तरह से समस्या का वर्णन नहीं किया है। – Blumer

+0

@ ब्लूमर: वीबी में आपका कोड स्निपेट अनिवार्य रूप से वही काम करता है, केवल ऑपरेशन के थोड़ा अलग क्रम के साथ और बिट ऑपरेशंस के बजाय पूर्णांक विभाजन के साथ। आप अनिवार्य रूप से बाइट स्वैपिंग बाइट 0 बाइट 3 के साथ हैं, और बाइट 1 बाइट 2 के साथ हैं – Demi

2

बिग-endian और थोड़ा-endian स्मृति में बाइट्स के आदेश का उल्लेख । 0x2f100000 जैसे मान में कोई अंतर्निहित अंतहीनता नहीं है, अंतहीनता सीपीयू आर्किटेक्चर पर निर्भर करती है।

यदि आप हमेशा 32-बिट मान में बाइट्स के क्रम को पीछे हटाना चाहते हैं, तो डेमी पोस्ट किए गए कोड का उपयोग करें।

यदि आप हमेशा विशिष्ट बाइट ऑर्डर प्राप्त करना चाहते हैं (क्योंकि आप नेटवर्क पर उन बाइट्स को स्थानांतरित करने की तैयारी कर रहे हैं, या उन्हें डिस्क फ़ाइल में संग्रहीत करने की तैयारी कर रहे हैं), तो कुछ और उपयोग करें। जैसे बीएसडी सॉकेट लाइब्रेरी में एक फ़ंक्शन htonl() है जो आपके सीपीयू के मूल 32-बिट मान लेता है और इसे बड़े-एंडियन ऑर्डर में डाल देता है।

यदि आप एक छोटी-छोटी मशीन, एचटनएल (303) == 0x2f100000 पर चल रहे हैं। यदि आप एक बड़े-एंडियन मशीन पर चल रहे हैं, htonl (303) == 303. दोनों स्थितियों में परिणाम स्मृति में बाइट्स [0x00, 0x00, 0x01, 0x2f] द्वारा प्रदर्शित किया जाएगा।

0

यदि कोई भी जो कुछ करने का प्रयास कर रहा था, उसमें कोई विशिष्ट शब्द लगा सकता है, तो भी मुझे यह सुनना अच्छा लगेगा। हालांकि, मुझे जो चाहिए वह करने का एक तरीका ढूंढ गया, और मैं इसे यहां पोस्ट करूंगा ताकि अगर कोई मेरी देखभाल कर रहा है, तो वे इसे पा सकते हैं। हो सकता है (शायद है) एक आसान, और अधिक प्रत्यक्ष यह करने के लिए जिस तरह से, लेकिन यहाँ है कि मैं क्या VB.Net में कर बाईटकोड मैं चाहता था वापस पाने के लिए समाप्त हो गया है:

Private Function Encode(ByVal original As Integer) as Byte()  
    Dim twofiftysixes As Integer = CInt(Math.Floor(original/256)) 
    Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes))/16)) 
    Dim ones As Integer = original Mod 16 
    Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0} 
    Return bytecode 
End Function 

प्रभावी रूप में पूर्णांक तोड़ कर हेक्स घटक, फिर उपयुक्त जोड़े को cBytes में परिवर्तित कर सकते हैं।

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