2011-08-05 16 views
11

रूपांतरण डबल सरणी मैं double[] सरणी को byte[] सरणी में कैसे बदलूं और इसके विपरीत?बाइट सरणी

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(sizeof(double)); 
     Console.WriteLine(double.MaxValue); 

     double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 }; 
     byte[] convertedarray = ? 

     Console.Read(); 
    } 
} 
+0

आप मूल्य (यानी के रूपांतरण करना चाहते हैं। '10.0' -> 10) या अंतर्निहित मशीन प्रतिनिधित्व के आठ बाइट्स (उदाहरण के लिए क्रमबद्धता के लिए)? – Richard

+1

हम किस प्रकार के रूपांतरण के बारे में बात कर रहे हैं? बाइट वैल्यू प्राप्त करने के लिए आप इसे दोहरी और "कास्ट" करने के लिए एक अभिन्न प्रकार पर ले जाना चाहते हैं? या आप दोहरे मूल्यों में से प्रत्येक का बाइट प्रतिनिधित्व प्राप्त करना चाहते हैं? आपको _clarify_ की आवश्यकता है। –

+0

इरादा BinaryWriter.Write() फ़ंक्शन का उपयोग करना है। लेकिन यह केवल बाइट स्वीकार करता है। मैं प्रत्येक डबल मानों का बाइट प्रतिनिधित्व प्राप्त करना चाहता हूं? – Raghaav

उत्तर

15

मान लें कि आप एक के बाद युगल इसी बाइट सरणी से एक में रखा चाहते हैं, कर सकते हैं LINQ इस से बाहर कम काम करने के:

static byte[] GetBytes(double[] values) 
{ 
    return values.SelectMany(value => BitConverter.GetBytes(value)).ToArray(); 
} 

वैकल्पिक रूप से, आप Buffer.BlockCopy() इस्तेमाल कर सकते हैं:

static byte[] GetBytesAlt(double[] values) 
{ 
    var result = new byte[values.Length * sizeof(double)]; 
    Buffer.BlockCopy(values, 0, result, 0, result.Length); 
    return result; 
} 

वापस बदलने के लिए:

static double[] GetDoubles(byte[] bytes) 
{ 
    return Enumerable.Range(0, bytes.Length/sizeof(double)) 
     .Select(offset => BitConverter.ToDouble(bytes, offset * sizeof(double))) 
     .ToArray(); 
} 

static double[] GetDoublesAlt(byte[] bytes) 
{ 
    var result = new double[bytes.Length/sizeof(double)]; 
    Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length); 
    return result; 
} 
+1

GetBytesAlt मेरे मामले में GetBytes से तेज़ी से काम करता है। धन्यवाद! – RredCat

+0

ब्लॉककॉपी संस्करण बहुत अच्छा है। उसके लिए धन्यवाद। –

-1
var byteArray = (from d in doubleArray 
       select (byte)d) 
       .ToArray(); 

var doubleArray = (from b in byteArray 
        select (double)b) 
        .ToArray(); 

चीयर्स।

+0

होगा यह बड़े युगल से कुछ डेटा निकाल देगा। – VMAtm

+0

ठीक है, ठीक है। मुझे लगता है कि सवाल पर्याप्त स्पष्ट नहीं था। –

+0

प्रश्न - हाँ, लेकिन यह टिप्पणी में साफ़ किया गया था। – VMAtm

0

आप कुछ इस तरह उपयोग कर सकते हैं, मुझे लगता है:

byte[] byteArray = new byteArray[...]; 
... 
byteArray.SetValue(Convert.ToByte(d), index); 
2
double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 }; 
byte[] convertedarray = array.Select(x => Convert.ToByte(x)).ToArray(); 
+0

बाइट [] वापस डबल [] में कैसे परिवर्तित करें। – Raghaav

0

आप Buffer.BlockCopy विधि का उपयोग करना चाहिए।

पेज उदाहरण देखें, आप स्पष्ट रूप से समझेंगे।

doubleArray = byteArray.Select(n => {return Convert.ToDouble(n);}).ToArray(); 
6

किसी एक को आप सरणी परिवर्तित करने के लिए Select और ToArray तरीकों का उपयोग कर सकते हैं:

oneArray = anotherArray.Select(n => { 
    // the conversion of one item from one type to another goes here 
}).ToArray(); 

बाइट के लिए डबल से बदलने के लिए:

byteArray = doubleArray.Select(n => { 
    return Convert.ToByte(n); 
}).ToArray(); 

आप दोगुना करने के लिए बाइट से परिवर्तित करने के लिए बस रूपांतरण भाग बदलें:

doubleArray = byteArray.Select(n => { 
    return Convert.ToDouble(n); 
}).ToArray(); 

आप एक मल्टी-बाइट प्रतिनिधित्व करने के लिए प्रत्येक डबल परिवर्तित करना चाहते हैं, तो आप SelectMany विधि और BitConverter वर्ग का उपयोग कर सकते हैं। चूंकि प्रत्येक डबल के बाइट्स की एक सरणी होगी, SelectMany विधि उन्हें एक ही परिणाम में फ़्लैट कर देगी।

byteArray = doubleArray.SelectMany(n => { 
    return BitConverter.GetBytes(n); 
}).ToArray(); 

युगल वापस करने के लिए बदलने के लिए, आप एक समय में बाइट्स आठ पाश करने की आवश्यकता होगी:

doubleArray = Enumerable.Range(0, byteArray.Length/8).Select(i => { 
    return BitConverter.ToDouble(byteArray, i * 8); 
}).ToArray(); 
+0

यह बिल्कुल सही है। +1 –