2011-07-23 13 views
7

से फ्लोट सरणी भेजें I C++ सर्वर से कुछ डेटा को सी # क्लाइंट में भेजने का प्रयास कर रहा हूं। मैं चार सरणी पर भेजने में सक्षम था। लेकिन फ्लोट सरणी के साथ कुछ समस्या है।सी ++ सर्वर से सी # क्लाइंट

यह सी ++ सर्वर साइड

float* arr; 
arr = new float[12]; 
//array init... 
if((bytecount = send(*csock, (const char*)arr, 12*sizeof(float), 0))==SOCKET_ERROR){ 
} 

पर कोड तो हाँ मैं आकार 12.

की एक नाव सरणी पर भेजने के लिए कोशिश कर रहा हूँ यहाँ क्लाइंट साइड के लिए कोड है। (यह अजीब था पहली जगह में धारा से बाहर नाव प्राप्त करने के लिए कोई आसान तरीका नहीं था। मैंने पहले सी # इस्तेमाल नहीं किया है और हो सकता है कि वहाँ कुछ बेहतर है कि?)

//get the data in a char array 
streamReader.Read(temp, 0, temp.Length); 
//**the problem lies right here in receiving the data itself 

//now convert the char array to byte array 
for (int i = 0; i < (elems*4); i++)   //elems = size of the float array 
{ 
    byteArray = BitConverter.GetBytes(temp[i]); 
    byteMain[i] = byteArray[0]; 
} 

//finally convert it to a float array 
for (int i = 0; i < elems; i++) 
{ 
    float val = BitConverter.ToSingle(byteMain, i * 4); 
    myarray[i] = val; 
} 

जाने की स्मृति को देखने पर डंप दोनों पक्षों और समस्या स्पष्ट हो जाएगा -

//c++ bytes corresponding to the first 5 floats in the array 
//(2.1 9.9 12.1 94.9 2.1 ...) 
66 66 06 40 66 66 1e 41  9a 99 41 41 cd cc bd 42 66 66 06 40 

//c# - this is what i get in the byteMain array 
66 66 06 40 66 66 1e 41  fd fd 41 41 fd 3d ? 42 66 66 06 40 

2 पर ग # यहाँ समस्याएं हैं पक्ष 1) पहले यह 127 से ऊपर 0x80 ऊपर कुछ भी() (असंगत संरचनाओं संभाल नहीं करता है) 2)? कुछ अविश्वसनीय कारण यह एक बाइट छोड़ देता है !!

और इस 'temp' में होता है सही डेटा

प्राप्त मैं बाहर कुछ लेकिन कुछ भी अभी भी लगाने की कोशिश कर रहा है के समय में। क्या आपको कोई विचार है कि यह क्यों हो रहा है? मुझे यकीन है कि मैं कुछ गलत कर रहा हूं ... बेहतर दृष्टिकोण के लिए सुझाव?

अपने कोड से धन्यवाद एक बहुत

उत्तर

5

यह स्पष्ट नहीं है कि क्या करने के लिए streamReader चर अंक (यानी क्या अपने प्रकार है?), लेकिन मैं आप के बजाय BinaryReader का उपयोग सुझाव है। इस तरह, आप सिर्फ डेटा one float at a time पढ़ सकते हैं और सभी पर byte[] सरणी के साथ कभी नहीं परेशान:

var reader = new BinaryReader(/* put source stream here */) 
var myFloat = reader.ReadSingle(); 
// do stuff with myFloat... 
// then you can read another 
myFloat = reader.ReadSingle(); 
// etc. 

अलग पाठकों डेटा के साथ अलग अलग बातें करते हैं। उदाहरण के लिए टेक्स्ट रीडर (और स्ट्रीम रीडर) मान लेंगे कि सभी एक विशेष एन्कोडिंग (जैसे यूटीएफ -8) में टेक्स्ट है और डेटा को उस तरीके से समझ सकता है जिसकी आपने अपेक्षा नहीं की थी। BinaryReader ऐसा नहीं करेगा क्योंकि यह आपको अपनी स्ट्रीम से सटीक डेटा प्रकारों को निर्दिष्ट करने के लिए डिज़ाइन किया गया था।

+0

'स्ट्रीम रीडर' को 'System.IO.StreamReader ()' के रूप में परिभाषित किया गया है। हाँ मुझे लगता है कि 'बाइनरी रीडर' एक बेहतर विकल्प हो सकता है। धन्यवाद मुझे इसे आज़माएं। – sg88

+0

धन्यवाद !! कोशिश की और इसका परीक्षण किया - यह – sg88

1

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

संपादित करें:
मुझे लगता है कि आपकी समस्या हस्ताक्षरित हस्ताक्षरित हस्ताक्षर के साथ है और इसे इसाक के उत्तर के साथ हल किया जा सकता है, लेकिन फिर भी मैंने जो कहा था उसे याद रखें।

यदि आपको इंजेक्शन जांच में मदद की ज़रूरत है तो बीज की नेटवर्क गाइड। यह नमूना होना चाहिए कि नेटवर्क पर फ्लोट को एन्कोड कैसे करें।

+0

yup काम करता है, मुझे इसके बारे में पता है। बस अगर आप मेमोरी डंप देखते हैं, तो कुछ फ्लोट्स को ठीक से स्थानांतरित कर दिया जाता है! – sg88

1

मुझे सी # के बारे में निश्चित नहीं है, लेकिन सी ++ फ्लोट्स (या किसी अन्य डेटा प्रकार) के आंतरिक, बाइनरी प्रस्तुतियों के बारे में कोई गारंटी नहीं देता है। आप सभी जानते हैं कि 0.42 इन 4 बाइट्स का उपयोग करके प्रदर्शित किया जा सकता है: '0', '।', '4', '2'।

सबसे आसान समाधान मानव-पठनीय तारों जैसे "2.1 9.9 12.1 94.9 2.1" और cin/cout/printf/scanf और दोस्तों का उपयोग करेगा।

+0

क्या 'printf' आउटपुट के रूप में गारंटी देता है? – svick

+0

मैं सिद्धांत में सहमत हूं, लेकिन व्यावहारिक रूप से, क्या वास्तव में आईईईई 754 (जो डबल और फ्लोट दोनों को परिभाषित करता है) की तुलना में उपयोग में कोई अलग फ्लोट प्रस्तुतिकरण है? –

+0

(और बीटीडब्ल्यू, सी # फ्लोट के प्रारूप को निर्दिष्ट करता है और ऊपर उल्लिखित मानक में परिभाषित किया जाने वाला डबल) http://msdn.microsoft.com/en-us/library/aa691146(v=vs.71).aspx –

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