2011-03-29 7 views
5

मैं System.Decimal मान से बिट्स प्राप्त करने में सक्षम होना चाहता हूं और उसके बाद मूल्य के स्ट्रिंग प्रस्तुति में परिवर्तित करना चाहता हूं, Decimal.ToString() की तरह ही मुझे एल्गोरिदम के साथ कठिन समय आ रहा है। - पहले 3 पूर्णांक मूल्य बिट्स होते हैं और पिछले पूर्णांक संकेत बिट और स्केलिंग कारक शामिलसी # में स्ट्रिंग करने के लिए System.Decimal बिट्स को कैसे परिवर्तित करें?

decimal d = 1403.45433M; 
int[] nDecimalBits = decimal.GetBits(d); 

// How to convert the 4 integers in nDecimalBits to a string 
// that contains "1403.45433"? 

मैं दशमलव के द्विआधारी लेआउट पता:

तो मैं कुछ इस तरह की है।

मैंने विभिन्न खोज शब्दों का उपयोग करके एल्गोरिदम की खोज करने की कोशिश की लेकिन दशमलव को ज्यादातर 'फ्लोटिंग-पॉइंट नंबर' के समानार्थी के रूप में उपयोग किया जाता है, इसलिए मेरी खोजों ने असंबंधित समस्याओं के जवाब को बदल दिया।

किसी भी मदद की सराहना की जाएगी।

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

यदि मेरे पास कोई विकल्प था, तो मैं स्पष्ट रूप से ToString() का उपयोग करता हूं लेकिन तब मुझे पूछने की आवश्यकता नहीं होगी।

+0

क्यों, क्यों आप उपयोग नहीं कर सकते यदि आप ऐसा करने की जरूरत है (तथ्य यह है कि वे इसे "हेक्स प्रतिनिधित्व"। यह द्विआधारी दशमलव अंक कोडित है। फोन से भ्रमित हो नहीं है) "दशमलव ।तार()"? –

उत्तर

1

जब से तुम ToString() उपयोग नहीं कर सकते, आप कैसे मोनो डेवलपर्स इस कार्यान्वित की जाँच करने के लिए चाहते हो सकता है:

प्रवेश बिंदु NumberToString(string, decimal, IFormatProvider) है।

दिलचस्प हिस्सा InitDecHexDigits(uint, ulong) है, इस

InitDecHexDigits ((uint)bits [2], ((ulong)bits [1] << 32) | (uint)bits [0]); 

की तरह कहा जाता हो जाता है जो और "सा करतब दिखाने और स्थानांतरण" करता है बात binary coded decimals (_val1 to _val4) है, जो तब हो सकता है में तीन पूर्णांकों कन्वर्ट करने के लिए (तुच्छता) एक स्ट्रिंग में परिवर्तित

+0

हेनज़ी, धन्यवाद - मैंने इस बारे में नहीं सोचा था। मैं इसे देख लूंगा, यह वही हो सकता है जो मैं ढूंढ रहा था। मेरे उद्देश्यों के लिए, बीसीडी लगभग सीधी स्ट्रिंग के रूप में उतनी ही अच्छी होगी और बीसीडी से एक स्ट्रिंग रूपांतरण छोटा है, जैसा आपने कहा था। मदद के लिए एक बार फिर से धन्यवाद। – xxbbcc

3

यह एल्गोरिदम नहीं है, लेकिन मुझे लगता है कि इसे मदद करनी चाहिए।

दशमलव बिट्स structure:

एक दशमलव संख्या के द्विआधारी प्रतिनिधित्व एक 1-बिट संकेत के होते हैं, एक 96-बिट पूर्णांक संख्या, और एक स्केलिंग कारक पूर्णांक संख्या विभाजित करने के लिए इस्तेमाल किया और निर्दिष्ट करें कि इसका कौन सा हिस्सा दशमलव अंश है। स्केलिंग कारक परोक्ष संख्या 10, से 28.

को वापसी मान लेकर एक प्रतिपादक के लिए उठाया है 32-बिट पर हस्ताक्षर किए पूर्णांकों का एक चार तत्व सरणी है।

पहले लौट आए सरणी के द्वितीय और तृतीय तत्व कम, मध्यम, और 96-बिट पूर्णांक संख्या के उच्च 32 बिट होते हैं।

लौटा सरणी का चौथा तत्व स्केल कारक और चिह्न शामिल है। इसमें निम्नलिखित भाग शामिल हैं:

बिट्स 0 से 15, निचले शब्द, अप्रयुक्त हैं और शून्य होना चाहिए।

बिट्स 16 से 23 0 और 28 के बीच एक प्रतिपादक , जो पूर्णांक संख्या विभाजित करने के लिए 10 की शक्ति को इंगित होना चाहिए।

बिट्स 24 से 30 अप्रयुक्त हैं और शून्य होना चाहिए।

बिट 31 में साइन शामिल है; 0 अर्थ सकारात्मक, और 1 नकारात्मक नकारात्मक है।

+0

आपके उत्तर के लिए धन्यवाद - मेरे पास पहले से ही ये विवरण था। मैं द्विआधारी-टू-स्ट्रिंग रूपांतरण कर सकता हूं लेकिन दशमलव एक अधिक जटिल मामला है (उच्च पूर्णांक में बिट्स को स्थानांतरित करने की आवश्यकता है क्योंकि कम पूर्णांक में बिट्स को संभाला जाता है) और मैं अभी तक समाधान का पता नहीं लगा सका। – xxbbcc

+0

@xxbbcc: मुझे यकीन नहीं है कि यह आपकी मदद क्यों नहीं करता है ... यह वास्तव में प्रारूप का वर्णन करता है कि दशमलव को पूर्णांक सरणी में कैसे संग्रहीत किया जाता है। मुझे लगता है कि एल्गोरिदम काफी सरल है: आप पहले तीन पूर्णांक को कुछ बड़े पूर्णांक डेटा प्रकार (जैसे बिगइंटर प्रकार जावा) में जोड़ते हैं, फिर आप दशमलव बिंदु को कहां रखना है यह निर्धारित करने के लिए चौथा पूर्णांक का उपयोग करते हैं। शायद यह मदद करेगा अगर आपने हमें बताया कि एल्गोरिदम निर्धारित करने का प्रयास करते समय आप कहां फंस गए हैं। – Heinzi

+0

मैं एक बेहद तंग समय सीमा पर काम कर रहा हूं और आखिरी मिनट में लक्षित प्लेटफार्म पर दशमलव के लिए समर्थन फेंक दिया गया था। रूपांतरण के दौरान मुझे सभी दशमलव अंकों को संरक्षित करना होगा, इसलिए डबल का उपयोग करना प्रश्न से बाहर है - गोल करने वाली त्रुटियां (दशमलव के बाहर) की अनुमति नहीं है, इसलिए मुझे सीधे दशमलव-टू-स्ट्रिंग रूपांतरण करना है जैसा कि मैं जाता हूं इनपुट बिट्स। बिट्स की सही संख्या में स्थानांतरित करना है जहां मैं अटक गया - int32 रूपांतरण के दौरान उपयोग करने वाला सबसे बड़ा संख्यात्मक प्रकार है। – xxbbcc

6

आप अपने मूल्य वापस कन्वर्ट करने के लिए दशमलव निर्माता Decimal(Int32[]) उपयोग कर सकते हैं:

दशमलव निर्माता (Int32 [])

में प्रतिनिधित्व दशमलव मान को दशमलव का एक नया उदाहरण आरंभीकृत बाइनरी और एक निर्दिष्ट सरणी में निहित है।

बाद में, आप ToString उपयोग करें यदि आप चाहते हैं कर सकते हैं। उदाहरण:

decimal d = 1403.45433M; 
int[] nDecimalBits = decimal.GetBits(d); 

decimal d2 = new decimal(nDecimalBits); 
string s = d2.ToString(); 
+1

+1: यहां पहिया को फिर से शुरू करने का कोई कारण नहीं है। बिट्स को दशमलव में बदलने के लिए दशमलव कन्स्ट्रक्टर का उपयोग करें। –

+0

आपने मेरा संदेश नहीं पढ़ा है। मेरे पास पहिया को फिर से शुरू करने के लिए एक अजीब आग्रह नहीं है - मुझे प्लेटफ़ॉर्म पर दशमलव के स्ट्रिंग मान को पुनर्निर्माण करने की आवश्यकता है जहां .NET उपलब्ध नहीं है। मेरे पास केवल 4 पूर्णांक हैं जो मुझे सर्वर से दशमलव से प्राप्त होते हैं।मैं 4 इंट्स के बजाय टेक्स्ट भेज सकता था लेकिन मुझे नेटवर्क यातायात को कम करने की भी आवश्यकता है। – xxbbcc

+1

@xxbbcc: मैंने आपका संदेश पढ़ा है ... सूचना प्लेटफ़ॉर्म पर .NET FW उपलब्ध नहीं है, वह जानकारी नई है। ;-) यह जानने में मदद कर सकता है * लक्ष्य * प्लेटफॉर्म पर कौन सी तकनीक उपलब्ध है। जावा में इस तरह के एल्गोरिदम को कार्यान्वित करना (बुगाई 13 के उत्तर में मेरी टिप्पणी देखें) उदाहरण के लिए, सी में मैंने बहुत आसान हो सकता है। मैंने मोनो के कार्यान्वयन के लिंक के साथ दूसरा जवाब जोड़ा है, जो केवल यूंट/उलंग डेटा प्रकारों के साथ काम करता है और कुछ बिट स्थानांतरण जादू। – Heinzi

2

वहाँ किसी भी प्रमुख कारण तुम सिर्फ दशमलव निर्माता उपयोग नहीं कर सकते है?

new decimal(nDecimalBits).ToString(); 
+0

यह सच है, लेकिन लगता है कि उसे ToString पसंद नहीं है, वह बिट्स से दशमलव स्ट्रिंग बनाना चाहता है (96 बिट int मान, एक्सपोनेंट, साइन निकालें)। –

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

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