簡體   English   中英

用C#BinaryWriter緩沖區發送段?

[英]C# BinaryWriter buffer for sending segments?

我不確定要尋找的是“緩沖區”,所以我將向您展示我的問題,然后你們可以確定這是否是正確的詞並提供解決方案。 目前,我正在為C#中的Java DataOutputStream類創建網絡端口。 我要做的最后一件事是通過發送分段信息來解決此問題。

這是我在C#中的WriteInt方法( ClientOutput是BinaryWriter的一個實例

public void WriteInt(int v)
{
    ClientOutput.Write (((uint)v >> 24) & 0xFF);
    ClientOutput.Write (((uint)v >> 16) & 0xFF);
    ClientOutput.Write (((uint)v >> 8) & 0xFF);
    ClientOutput.Write (((uint)v >> 0) & 0xFF);
    IncCount (4);
}

對於任何想比較的人; 這是Java的原始版本

public final void writeInt(int v) throws IOException {
       out.write((v >>> 24) & 0xFF);
       out.write((v >>> 16) & 0xFF);
       out.write((v >>>  8) & 0xFF);
       out.write((v >>>  0) & 0xFF);
       incCount(4);
}

通常,在Java中,必須先調用“ Flush() ”,然后才能將數據發送到服務器或客戶端。 但是,似乎每當您調用“ Write() ”時BinaryWriter都會自動刷新

這是Java中的“ ReadInt() ”代碼。

public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}

當Java代碼執行為“ WriteInt ”並在服務器上調用ReadInt時 ,該值將正確顯示; 但是,當前服務器正在4次不同的時間處理整數,並根據分段顯示整數值。

輸入示例( C# ):

Client.WriteInt(1000);

示例輸出( Java ):

0
0
50331648
-402653184

當輸出應為:

1000

幾天前我剛接觸C#,請多多包涵,我可能會問一個愚蠢的問題。

BinaryWriter有很多Write()方法重載,看起來您正在調用Write(Int32)重載,它當然會發送四個4字節整數。

您只需將值轉換為Write()的字節即可解決此問題:

public void WriteInt(int v)
{
    ClientOutput.Write ((byte)(((uint)v >> 24) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 16) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 8) & 0xFF));
    ClientOutput.Write ((byte)(((uint)v >> 0) & 0xFF));
    IncCount (4);
}

請注意,從技術上講,您無需在移位之前將值v強制轉換為uint。 即使發生符號擴展,您還是要屏蔽除最后一個字節以外的所有字節。 但是那部分不應該傷害任何東西。

查看Jon Skeet的BinianWriter的字節序感知版本。 這里有討論和一些鏈接: BinaryWriter Endian問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM