2011-06-04 157 views
1

我是網絡編程的新手,所以我有一個問題:在我的C++和C#之間發送一個整數是否安全(因爲32有「endianess」問題)去做?通過網絡傳輸int

在我的程序中,我將int轉換爲char(我知道它低於255)併發送它。不過,我想發32 int。我嘗試了使用協議緩衝區的行爲。我使用C++中的WriteVarint32和C#中的ProtoReader.ReadUInt32,但沒有成功(C#中的例外)。我認爲它會工作後,我讀this

你會如此善良,並建議我在C++和C#應用程序之間發送一個整數的正確方法嗎?如果你向我解釋如何用協議緩衝區(在C#的情況下爲protobuf-net)做到這一點,我會非常高興。

+7

那麼爲什麼16bit沒有endianness和32bit的問題呢? bigendian/littleendian機器的16位數據將會有所不同。我建議你決定一種方法(例如協議緩衝區)並嘗試一下,並詢問你得到的問題。 – 2011-06-04 09:55:41

+0

@David varint編碼工作在endianness周圍(這是隱含的) – 2011-06-04 11:57:09

回答

0

如果您使用protobuf-net編寫,WithLengthPrefix方法將爲您執行此操作。我很樂意幫助(我是作者)。順便說一句,它拋出一個例外的原因是varit值本身在protobuf流中通常不是有效的。如果傳遞0作爲字段編號(或者傳遞一個更純的protobuf流的正字段編號;但這是可選的),系統將在WithLengthPrefix的情況下覆蓋此值。

碰巧在ProtoReader上有一個方法來讀取一個孤立的varint(不用擔心protobuf流語義),如果這樣做對ProtoWriter是有用的,那麼將它添加到ProtoWriter中將是微不足道的。

btw - 就PrefixStyle而言,Base128與varint相同。有些人更喜歡32位的前綴,與其他系統結婚 - 因此提供了一些其他系統。

+0

我想使用WithLengthPrefix。我的問題是我不知道我應該如何使用C++ Protobuf API來構造C#protobuf-net可以理解的前綴。 'Base128與varint相同' - 我嘗試發送大小爲varint。 C#引發System.IO.EndOfStreamException。前綴是隻存在於protobuf-net中的想法。 C++實現甚至沒有考慮到這個概念。 – 2011-06-04 22:14:40

+0

@主 - 的確如此。對於這個(在文檔中)的策略只有一個簡短的提及,其基本上是說「添加自己的長度」。重新EOF - 我重新部署了一個v2樣本,我在之前的討論中添加了一個v2樣本(我相信) - 請檢查您是否有當前版本。你能給出一個關於你的策略的簡短的話:「我通過C++的消息是27字節,所以我寫了[TODO:字節]作爲前綴,然後是27字節」 - 那麼我應該能夠看到你有什麼。 – 2011-06-04 22:38:03

+0

消息測試{ required int32 id = 1; } 這是我想發送的消息。現在我設置id(用C++): 測試測試; test.set_id(1234); 我發送Varint32 coded_output-> WriteVarint32(test.ByteSize()); C#應用程序應該正好收到這些字節(以十六進制表示)03 08 d2 09. 03是其餘部分是消息的大小。目前,我很難將從C#發回的響應發送給C++。我相信我會盡快完成。 – 2011-06-05 11:35:01

1

基本上它將取決於您使用的網絡庫以及它們兩端的兼容性。在最低級別,數據以流或字節塊的形式傳輸。當這些字節被轉換回字節以上的任何更復雜的結構(甚至是int)時,編碼顯然很重要,並且需要在兩端進行匹配。

最簡單的事情就是試試看。

這聽起來像你可能有興趣儘可能緊湊地包裝數據(從你的轉換整數到字符的評論),在這種情況下,你可能應該只是在兩端寫一套低級包裝例程。這樣你就不用擔心編碼問題了,你可以從數據包中榨取最後一點。

1

varint編碼沒有endianess問題,它始終是小端設計。它以最低有效位7位開始一次存儲7位數值,並且當沒有剩餘1位時使用第8位作爲停止位。

在C#中使用Read7BitEncodedInt方法讀取varint編碼的整數。

+0

我不確定,但似乎Read7BitEncodedInt在我使用的MonoDevelop中不可用。任何其他想法? – 2011-06-04 10:44:51

+0

@ lord-didger:它在'BinaryReader'類中。如果您使用其他方式來讀取數據,您可以輕鬆地調整代碼,這只是幾行代碼。你可以在這裏找到源代碼:http://www.koders.com/csharp/fid4083672E4B426989ECED8C0C517B0327B94BC1CB.aspx – Guffa 2011-06-04 12:07:56