2013-08-24 91 views
3

我正在將Java應用程序轉換爲C#,並且我有關於基礎字節流的一般問題。Java Socket與C#TcpClient

'byte'在C#中是無符號的,而不是在Java中登錄。

這對我的代碼中用於比較等價字節的部分做了什麼?例如:

Java代碼

public final static byte IAC = (byte)255; 
... 
void parseBuffer(byte[] bb, int len) { 
    try { 
     for(int i = 0;i < len; i++) { 
      if(bb[i] == IAC) 
       DoSomething(); 
     } 
    } 
} 

我需要做任何事情來的IAC變量的聲明?它會是其他什麼(字節)255?

感謝您的幫助提前。

+0

'-1'? .......... – I4V

回答

1

我是否需要對IAC變量的聲明做任何事情?

不,它絕對沒問題。對於IAC,最終的值爲-1,但這很好,並且仍然表示一個所有位都設置的字節。如果從C#端發送一個255字節的值,它將在Java端正確拾取。

另一種方法是用較大的數據類型的工作(例如int爲了方便起見,並使用bitmasking與在範圍[0,255]的值,以結束:

public static final int IAC = 255; 
... 
void parseBuffer(byte[] bb, int len) { 
    try { 
     for(int i = 0; i < len; i++) { 
      int value = bb[i] & 0xff; // To get a value in the range [0, 255] 
      if (value == IAC) { 
       DoSomething(); 
      } 
     } 
    } 
} 
+0

感謝Jon。快速跟進你的迴應。你是否說當從TcpClient讀取字節流時,它將讀取未簽名的字節值,以便將它們與其他無符號字節像我的IAC聲明可以,並且在語義上與Java版本相同? – user1137939

+0

@ user1137939:字節只是字節 - 8位值在C#中,所有8位設置的「字節」值的數值爲255 ,而在Jav它有一個數值-1。這是不幸的(你幾乎從不*實際上想把字節視爲有符號值),但你應該沒問題。試着不斷將它們想象成8位而不是數字的集合 - 它會讓你的生活更輕鬆:) –