2013-02-25 106 views
3

美好的一天,Java和未簽名字節

不好意思問這樣一個常見的問題,但我一直在使用Google和閱讀,我仍然沒有得到正確的答案。我需要使用無符號字節數組。我需要通過網絡發送某些字符到服務器的一些字符是大於127

我的代碼的簡化版本,下面,試圖理解這個概念:

int i= 160; 
byte j = (byte) i; 
System.out.println((byte)i); 
System.out.println(j); 

和這給出的輸出: -96 -96

我需要打印160的服務器要求160一個字節,如果它接收到-96它不接受該值。 我之所以用int是因爲當我在閱讀如何解決問題時,我經常遇到只使用int的建議,但我不太明白,因爲我需要我的數組是類型字節..

這是我的代碼的一部分,其中i陣列發送:

public boolean send(byte[] data) { 
    try { 
    out.write(data); // Write the data to the outStream 
    out.flush(); 
    } catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
return false; // Return false if the TCP Transmit failed 
// } 
return false; 
} 

我真的很感激,如果有人可以幫助我。

如果我遺漏了任何重要信息,請讓我知道。

+0

是否要通過非二進制安全的介質發送二進制數據?如果是這樣的話,你可以使用:http://en.wikipedia.org/wiki/Base64 – NullUserException 2013-02-25 18:16:40

回答

10

Java在有符號和無符號字節之間沒有區別。這兩個以下的將相同的值賦給一個字節:

byte i = (byte)160; 
byte j = (byte)-96; 

它取決於你作爲一個開發者把他們當作符號或無符號,當你打印出來。默認值是打印它們的符號,但可以通過以無符號方式將它們轉換爲整數來強制它們進行無符號打印。

System.out.println(i); // -96 
System.out.println(0xff&i); // 160 

如果你想知道的字節數可以在同一時間同時表示正數和負數,對two’s complement arithmetic in Java

2

發送-96看完這篇文章是正確的行爲。有符號和無符號字節在打印出來時是不同的,但不是在位表示中,當它們被另一個服務器接收時它們不應該有所作爲。

1

字節未自行簽名或未簽名。它們在應用某些操作時被解釋爲(例如,與0相比以確定符號)。這些操作可以是有符號和無符號的,而在Java中,只有有符號的字節操作可用。所以你引用的代碼對於這個問題是無用的 - 它發送字節但不做任何操作。更好地顯示接收字節的代碼。一種正確且方便的方法是使用java.io.InputStream.read()方法,該方法返回字節,範圍爲0 ... 255。

+0

我沒有接收器/服務器的代碼。我正在編寫一個客戶端來與之交談。我不需要對它進行任何操作,只需要=操作符。我只想通過網絡發送原始數據。 – Zapnologica 2013-02-25 20:20:02

2

沒有System.out.println(字節)。最接近的是System.out.println(int)。這意味着你的字節值被轉換爲整數。該轉換擴展了高位,導致負數。

這下面的代碼將證明我的觀點:

byte[] data = 
{ 
    (byte)0x01, 
    (byte)0x02, 
    (byte)0x7F, 
    (byte)0x80 
}; 

for (byte current : data) 
{ 
    String output = String.format("0x%x, 0x%x", current, (int)current); 
    System.out.println(output); 
} 

如果你想使用的System.out.println看到你的字節值,屏蔽掉前三個字節整數值,是這樣的:

System.out.println(((0x000000FF & (int)current); 
+0

噢好吧,所以你說這個問題不是我的字節,而是system.print。打印件將其轉換爲負數? – Zapnologica 2013-02-25 20:18:09

+0

當字節轉換爲整數時,高位被擴展。這會導致負整數值。 – DwB 2013-02-25 20:28:29

+0

什麼是0x%x在這裏? – 2014-12-18 17:15:54