2011-04-24 13 views
20

रूबी में बेस से आने और कोशिश करने के लिए ... मैंने जो कोड डाला है, वह काफी दोहराया गया है। क्या एक बेहतर तरीका है?हेक्साडेसिमल, दशमलव, ऑक्टल, और ASCII को परिवर्तित करना?

module Converter 
    def self.convert(value, from, to) 
    case from 
    when :hex 
     case to 
     when :dec 
     # code to change hex to dec 
     when :oct 
     # code to change hex to oct 
     when :bin 
     # code to change hex to bin 
     when :ascii 
     # code to change hex to ascii 
     end 
    when :dec 
     case to 
     when :hex 
     # code to change dec to hex 
     when :oct 
     # code to change dec to oct 
     when :bin 
     # code to change dec to bin 
     when :ascii 
     # code to change dec to ascii 
     end 
    when :oct 
     case to 
     when :hex 
     # code to change oct to hex 
     when :dec 
     # code to change oct to dec 
     when :bin 
     # code to change oct to bin 
     when :ascii 
     # code to change oct to ascii 
     end 
    when :bin 
     case to 
     when :hex 
     # code to change bin to hex 
     when :dec 
     # code to change bin to dec 
     when :oct 
     # code to change bin to oct 
     when :ascii 
     # code to change bin to ascii 
     end 
    when :ascii 
     case to 
     when :hex 
     # code to change ascii to hex 
     when :dec 
     # code to change ascii to dec 
     when :oct 
     # code to change ascii to oct 
     when :bin 
     # code to change ascii to bin 
     end 
    end 
    end 
end 
+0

कनवर्ट स्ट्रिंग और स्ट्रिंग स्ट्रिंग लेता है, है ना? क्या आप कुछ उदाहरण दिखा सकते हैं? हेक्साडेसिमल उदाहरण के लिए "0xXX" हैं? – tokland

उत्तर

74
class String 
    def convert_base(from, to) 
    self.to_i(from).to_s(to) 
    # works up-to base 36 
    end 
end 

p '1010'.convert_base(2, 10) #=> "10" 
p 'FF'.convert_base(16, 2) #=> "11111111" 
+2

प्रतिभा। धन्यवाद। – RyanScottLewis

3

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

इसके अलावा, कृपया याद रखें कि स्मृति में एक संख्यात्मक मान में वास्तव में आधार की अवधारणा नहीं है (इसे बाइनरी के रूप में दर्शाया गया है, जाहिर है, लेकिन यह अधिकतर अप्रासंगिक है)। यह सिर्फ एक मूल्य है। एक बार जब आप तारों को शामिल कर लेते हैं तो आधार वास्तव में महत्वपूर्ण बन जाते हैं। इसलिए यदि आपके "दशमलव" का अर्थ वास्तव में अंकों की स्ट्रिंग के बजाय संख्यात्मक मान है, तो इसे "दशमलव" नहीं कहना सर्वोत्तम हो सकता है।

2

मैं बाइनरी डेटा में हेरफेर करने के लिए स्ट्रिंग क्लास का उपयोग करने से सहमत नहीं हूं। यह फिक्सनम का उपयोग करने के लिए अधिक उपयुक्त प्रतीत होता है क्योंकि उस वर्ग में बिटवाई ऑपरेटर हैं। अनुमोदित, स्ट्रिंग क्लास में "ENV" के साथ स्ट्रिंग # to_s है और एक इंटीजर को एक नए बेस में बदल देगा, 10.to_s(16) हम यहां संख्याओं के साथ काम कर रहे हैं। लेकिन यह सिर्फ IMHO है। अन्यथा अच्छा जवाब।

यहां फिक्सनम के लिए मेरे उपयोग उदाहरण हैं।

class Fixnum 
    def convert_base(to) 
    self.to_s(to).to_i 
    end 
end 

p '1010'.to_i(2).convert_base(10) #=> 10 real numbers 
p 'FF'.hex.convert_base(2)  #=> 11111111 
p 72.convert_base(16)    #=> 48 
संबंधित मुद्दे