2012-12-13 66 views
2

緩衝區是一個字節緩衝區。我用這個丟失了percision錯誤。用十六進制表示的Java中的字節數

byte myPort = buffer.get(0); // Might need to change this depending on byte order 
    switch(myPort){ 
     case 0xF1: // Chat service 
      break; 
     case 0xF2: // Voice service 
      break; 
     case 0xF3: // Video service 
      break; 
     case 0xF4: // File transfer service 
      break; 
     case 0xF5: // Remote login 
      break; 
    } 

顯然,0xFF的不是Java中的字節,其真正困惑我。我不知道如果我失去它,但不是0xF一個半字節和0xFF一個字節?顯然,我的ide netbeans允許字節值一直到127.這似乎是有符號值的問題,但我不知道爲什麼。

感謝您的任何幫助。

+1

而你在哪裏得到這個錯誤沒有無符號的數據類型的一些良好的背景信息?另外,我沒有在代碼中看到'0xFF'的使用。代碼是否完整? –

+0

我遇到0xF1等錯誤。案件給我的錯誤。這不是整個代碼,而是它的唯一相關部分。 –

+0

這是因爲你的值'0xF1'不在字節範圍內 - '[-128,127]'。 Java中的字節被簽名。 「0xF1」等於「241」。 –

回答

3

正如評論中所述,字節是[-128..127]。

您應該將字節從字節的緩衝區轉換爲int,以保持你承擔的「無符號字節」範圍內(並且不存在於Java中):

int myPort = buffer.get(0) & 0xff; // Might need to change this depending on byte order 
    switch(myPort){ 
     case 0xF1: // Chat service 
      break; 
     case 0xF2: // Voice service 
      break; 
     case 0xF3: // Video service 
      break; 
     case 0xF4: // File transfer service 
      break; 
     case 0xF5: // Remote login 
      break; 
    } 

注意,簡單地分配字節一個int是行不通的,由於符號擴展:

byte val = (byte) 0xb6; 
    int myPort = val; 

結果myPort = -74 (0xffffffb6),而

byte val = (byte) 0xb6; 
    int myPort = val & 0xff; 

結果在myPort = 182 (0xb6)


Why doesn't Java support unsigned ints?關於在Java中

+1

我想我學到了一些新東西。對不起,我是一名C/C++程序員,所以我習慣於分配字節和類似的東西。我不知道它不存在於Java中。 –

+0

它是Java設計決策之一,它甚至會導致長時間Java程序員的頭痛:) –

1

你是正確的:一個Java「字節」是有符號數-127到127

之間的解決方案是簡單地轉換爲「短」或「INT」。

例:

int myPort = buffer.get(0); // Might need to change this depending on byte order 
    switch(myPort){ 
     case 0xF1: // Chat service 
      break; 
     case 0xF2: // Voice service 
      break; 
     case 0xF3: // Video service 
      break; 
     case 0xF4: // File transfer service 
      break; 
     case 0xF5: // Remote login 
      break; 
    } 

如果你願意離開 「MyPort上」 一 「字節」,後來乾脆投在switch語句來詮釋:

例:

byte myPort = buffer.get(0); // Might need to change this depending on byte order 
    switch(0xff & (int)myPort){ 
     case 0xF1: // Chat service 
      break; 
     ... 

無論是方式,BITS是相同的:這是他們的意思是造成編譯錯誤。

+1

難道你不需要用'(myPort&0x00FF)'屏蔽myPort來避免符號擴展嗎? – josefx

+0

你是對的。更改:)謝謝 – paulsm4

+0

不,我不需要掩蓋myPort,因爲我只通過網絡發送最低有效字節。我假設我的程序中的高字節是0xFF。它是一個服務器,它至少在字節請求上建立連接,然後將客戶端通道套接字更改爲綁定到(0xFF00 | myPort)。我想通過網絡儘可能少地發送。 –

相關問題