2013-04-08 49 views
0

如何在java中實現一個無符號字節,限制的大小應該只有1個字節,即我們不能通過And'轉換爲short或int'使用0xFF如何在java中實現一個無符號字節,限制的大小應該只有1個字節

我必須通過套接字傳輸一個無符號字節數組,因爲接收結束是一個C代碼方法期待無符號字節數組的大小爲1字節,但由於Java不支持無符號字節的概念, 。我們是否有任何方法來實現這一點。

字節b =(字節)0xF0;甚至字節b1 = 0x00;沒有通過套接字通道正確發送。請參閱寫入服務器的方法。

公共無效編碼(IoSession會話,對象信息,ProtocolEncoderOutput出) 拋出異常{

//lProxylogger.info("Inside ProtocolEncoderAdapter. Encoding response to client.."); 
    String response ; 

    //lProxylogger.info("The response length in encode adapter is "+ response.length()+" Message="+response); 
    byte[] responseStream; 

    response=(String) message; 

    responseStream= response.getBytes("windows-1252"); 

    //responseStream=serialize(message); 

    IoBuffer buffer = IoBuffer.allocate(responseStream.length); 
    // buffer.putInt(response.length); 
    //IoBuffer buffer=(IoBuffer)message; 
     // buffer.putObject(message); 
    System.out.println("Encoded Response:"+new String(responseStream)); 
    for(byte b:responseStream) 
     System.out.print(b+","); 
    System.out.println(); 
    buffer.put(responseStream); 
//  lProxylogger.info("the response buffer size is "+ buffer.capacity()); 
    buffer.setAutoShrink(true); 
    buffer.shrink(); 
    // lProxylogger.info("After shrinking the buffer size is "+ buffer.capacity()); 
    buffer.flip(); 

    //System.out.println("Writing response to Stream.."); 
    out.write(buffer); 

} 
+0

我認爲問題在於如何在C端打印出二進制文件,請參閱我的答案。 – 2013-04-08 07:10:33

回答

4

簽名岬只是在於你如何解釋一個字節的8位。通過簽署,它不再更短,並且在傳輸方面沒有什麼不同。你只是發送字節。這取決於任何解釋該字節的內容,如果它是無符號的,則將其視爲無符號,但這與將其表示爲8位或發送無關。

+0

謝謝Sean回覆,當我試圖通過套接字發送0xF0(-16 ASCII轉換)或甚至0x00時,該值通過套接字結尾沒有被正確解碼(某些垃圾)。我正在使用Java代碼,接收端以C語言實現,我正在使用Redhat Linux平臺。 – CodeFReak 2013-04-08 05:45:02

+0

正如你所說,這是C代碼中「解碼」(解釋爲簽名)的問題。它與Java中的發送/編碼端無關。 – 2013-04-08 05:51:26

+0

確切的,但我的目標是發送一些值,如0xF0,0x00通過套接字到期待無符號字節的C編碼服務器。我可以正確接收和解碼來自服務器的所有值,但是當我嘗試發送這些值時,它會報告一些垃圾,而不是接收端的預期值。這裏是我的實現發送數據到服務器(out.write方法最後寫入服務器) – CodeFReak 2013-04-08 05:55:01

0

看來你選擇的字符編碼可能會破壞你的字符串。如果你也使用這樣的編碼,你不應該嘗試在文本中放置二進制文件。

我建議你簡化你的代碼。而不是嘗試

String response=(String) message; 
for(char ch : response.toCharArray()) { 
    System.out.println(Integer.toHexString(ch) + ", "); 
    out.write(ch); 
} 

如果這個工程,我建議嘗試ISO-8859-1編碼,它基本上做同樣的事情。

+0

也更改爲char數組會將大小提升爲2個字節,而服務器需要1個字節纔會導致溢出。 我嘗試了不同的編碼,但更改爲ISO-8859-1也不起作用,因爲它是windows-1252的子集。 – CodeFReak 2013-04-08 08:14:49

+0

ISO-8859-1對所有可以表示爲一個字節的字符進行編碼而不改變。這將在字符串中使用二進制而不會混淆它。 – 2013-04-08 12:50:04

+0

我不清楚你希望編碼如何工作,因爲windows-1252會將一些字符變成一個或兩個字節,反之亦然。這意味着您可能不會從4個字節中獲得4個字符。 – 2013-04-08 12:53:14

相關問題