2010-11-06 39 views
1

我仍在研究正常工作的ICMP監聽器,並且對如何處理'endianness'感到困惑。我的第一種方法是將數據從緩衝區中取出到合適的(數組最初)字段(uint等)中,然後在將數據傳遞給相應的BitConverter成員之前顛倒字節順序。雖然它有效,但它不是很優雅。如何處理'Endianness'

第二種方法是準備由二維數組驅動的整個緩衝區,它包含需要調整的字段的位置和長度。這也起到了作用,還有一個額外的好處,即現有的代碼不需要改變,但是在可讀性方面缺乏(嚴重)。

我正在努力理解當前可用的新編程環境(特別是.Net和C#),對於1975年存在的問題仍未得到適當處理,我感到非常驚訝。我爲(IBM)個人電腦開發了第一個(ISA)網卡(針對以太網1.0,基於Motorola 68000 CPU),我清楚地記得所涉及的問題;不僅僅是多字基本類型,而且所有數據都是不同的'endiannnes'(然後是16位字),這有效地消除了'DMA'數據的可能性。

我認爲網絡適配器扮演一個非常小的角色來調整適合其環境的數據,但這樣解決問題似乎不是太大的問題。 (?)

底線;我不能相信我是唯一一個揹負這一責任的人,我真誠希望有人提出一個比我現在使用的解決方案更好的解決方案。

(本文編譯它與谷歌的幫助下翻譯(我敢荷蘭))

+1

不僅你有這個問題: - 參見http://stackoverflow.com/questions/217980/c-little-endian-or-big-endian好。 – Vlad 2010-11-06 11:49:31

回答

0

Java的方法是隻讓一切大端即使硬件是沒有的。大多數其他語言要求您在主機和網絡訂單之間進行轉換。我看不出網絡適配器是怎麼做的,因爲它不知道數據的結構。直到你到達應用層,你是否擁有完成轉換所需的所有信息。

所以,是的,我們都堅持只是在做你在這裏做的事情。

+0

(感謝Vlad和Jotn)我一定很笨;我的適配器在我的系統中,我的操作系統已加載;但它(適配器)將無法識別其環境?我知道它確實,但那是可以接受的嗎? – Nebbukadnezzar 2010-11-06 13:05:40

+0

適配器不知道應用程序,並且通過網絡發送的數據結構由應用程序確定。如果需要,您的應用程序可以發送小端數據,但每個人都需要在大端上進行標準化。 – JOTN 2010-11-06 21:09:57

2

簡單地;不要使用BitConverter,如果有Endianness是一個問題的遠程機會(對於.NET主要是​​指「在某些硬件上單聲道」AFAIK)。 Jon Skeet在「MiscUtil」中有一個EndianBitConverter,可能有幫助;否則只是通過位移等方式進行編碼。

+0

非常感謝!我會研究它,但是你對「真正」解決方案有何看法? – Nebbukadnezzar 2010-11-06 13:06:09