我有一個客戶端/服務器體系結構(C#.Net 4.0),它將數據的命令包作爲字節數組發送。任何命令中都有可變數量的參數,每個參數的長度都是可變的。正因爲如此,我使用分隔符來結束參數和整個命令。操作數總是2個字節,兩種分隔符都是1個字節。最後一個parameter_delmiter是冗餘的,因爲command_delmiter提供了相同的功能。TCP/IP客戶端/服務器命令數據
的命令結構如下:
FIELD SIZE(BYTES)
operand 2
parameter1 x
parameter_delmiter 1
parameter2 x
parameter_delmiter 1
parameterN x
.............
.............
command_delmiter 1
參數是從許多不同類型的來源,即,整數,字符串等所有編碼成字節數組。
我遇到的問題是,有時編碼到字節數組中的參數包含的字節與分隔符的值相同。例如command_delmiter = 255 ..並且一個參數可以在其中包含那個字節。
有3種方式我能想到定影此的:
1)進行編碼的參數不同,使得它們不能是相同的值作爲分隔符(255和254)模量?這將意味着參數將變大,即Int16將會超過2個字節等。
2)根本不要使用分隔符,在命令結構的開始處使用計數和長度值。
3)使用別的東西。
據我所知,該方式TCP/IP緩衝器工作是某種定界符的必須被用來單獨「命令」或「數據包」作爲緩衝液可以包含多個命令,或命令可能跨越多個緩衝區..因此,這個數組似乎是一個明顯的候選人,唯一的問題是字節數組可能包含多個命令(帶有參數)。所以字節數組仍然必須被切碎才能感覺到BinaryReader。
建議?
謝謝。
是的,我已經保留了一個獨立的'累積'緩衝區,我也附加了所有傳入的數據。我檢查這個二級緩衝區是否有任何有效和完整的數據「塊」並對其進行處理。所以你建議使用長度而不是分隔符。感謝您驗證我認爲是正確的道路。 –