2015-06-11 48 views
1

我的應用程序正在通過UDP套接字從另一個應用程序接收一個結構體。另一個應用程序是用C++編寫的。該結構具有不同類型的變量。 在我的申請側,我解碼從字節數組所需類型的接收到的消息,並把它在一個字典類型以下列方式可變DecodedMessage字節數組編組

DecodedMessage.Add("VarName", (float)BitConvertor.ToInt32(Buffer, VarOffset)); 

問題是,我得到的值是不正確的。我相信問題是我必須做一些打毛球,但我不知道如何去做。 C++應用程序使用#pragma pack(1)聲明。

+0

你能給出一個不正確的值的例子嗎?像expected = x,got = y?它可能是如果你的C++應用程序使用big-endian編碼和c#代碼小端或反之亦然 –

+0

@DenisYarkovoy數字只是爆炸,而不是獲得約1.02的值,我得到1E + 09左右 – AnR

+0

以及你的代碼是從緩衝區中讀取Int32的,所以你不能期望得到1.02。如果你的C++結構中的浮點數比T_D給出的答案是正確的,並且你需要使用ToSingle轉換器來正確讀取你的float –

回答

0

如果C++應用程序發送浮點值,則需要使用BitConverter.ToSingle而不是ToInt32()。但是從你的問題來看,不清楚這是否是這種情況,或者如果C++應用程序正在發送你只想保存爲浮點值的int值。

編輯

好了,你的C++應用程序正在發送一個特定的結構,讓我們假定它看起來像這樣:

struct whatever 
{ 
    int var1; 
    float var2; 
    byte var3[16]; 
} 

既然你知道數據的結構,你可以閱讀像這樣的BinaryReader:

var binReader = new BinaryReader(new MemoryStream(Buffer)); 
int var1 = binReader.ReadInt32(); 
float var2 = binReader.ReadSingle(); 
byte[] var3 = binReader.ReadBytes(16); 

現在你可以做任何你想要的數據。

+0

C++發送一個具有不同類型字段的結構體(即整型,浮點型,字符型,長整型),並且我想將所有數據保存爲浮點數。 t說,你認爲這個問題與BitConvertor有關嗎? – AnR

+0

@AnR,不要轉換它們,將它們存儲爲接收到的數據('byte []'?)或以某種方式發送它們的類型並使用'switch/case'來選擇如何轉換它們(仍然,'VarName'應該是'對象「能夠容納任何類型) – Sinatr

0

而不是編組,UDP應用程序可以序列化對象並通過UDP套接字傳輸消息。這是一個現代化的方法,並且可以由C++庫支持(例如:使用boost庫的序列化非常容易並且快速實現)