1. 程式人生 > >使用數組和隊列的方式解析字節

使用數組和隊列的方式解析字節

alloc inf str byte[] receive sage 指定 使用 byte

下面的邏輯為:從socket通道中讀取到接收的數據到字節緩沖區,將緩沖區中的數據輸出到字節的數據btyes中,再將數組中的數據一個個讀取到字節隊列bytesto 中(過來掉不需要的字節),最終

將bytesto 的數據轉換到數組arr中,通過 new String(byte[] bytes, Charset charset)的方式將字節數據arr轉換為指定字符集的字符串。(字符集轉換的時候,一定要註意,有的時候一不小心就轉為亂碼了!)

// 返回為之創建此鍵的通道。
client = (SocketChannel) selectionKey.channel();
//將緩沖區清空以備下次讀取
receivebuffer.clear();

//創建數據緩沖區receivebuffer

private ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);

//讀取服務器發送來的數據到緩沖區中
count = client.read(receivebuffer); // count 為緩沖字節的長度
if (count > 0) {
String receiveText = new String(receivebuffer.array(),0,count,"UTF-8");
// receiveText = new String(receivebuffer.array());
System.out.println("\r\n[接受到數據]:"+receiveText);

/**************************************************************/
receivebuffer.flip();
byte[] bytes = new byte[receivebuffer.remaining()];
receivebuffer.get(bytes);



// byte[] bytes= receiveText.getBytes();
// byte[] bytes=receiveText.getBytes("UTF-8");
List <Byte> bytesto = new LinkedList <Byte> ();
String msg="";
byte byteTemp = MLLP_START;
for(int i=0;i<bytes.length;i++){
byte[] b = new byte[1];
b[0]=bytes[i];
if(b != null && b.length > 0){
byteTemp = b[0];
}
if (byteTemp != MLLP_START && byteTemp != MLLP_END1)
{
bytesto.add (byteTemp);

}
}

byte[] arr = new byte[bytesto.size ()];
for (int i = 0; i < bytesto.size (); i++)
{
arr[i] = bytesto.get (i);
}
// msg = new String (arr, "GBK");
msg = new String (arr, "UTF-8");

ui.setMessage("從serverSocket獲得信息:"+msg);
logger.info("從serverSocket獲得信息:"+msg);
System.out.println("接收:"+msg); //處理消息內容

}

使用數組和隊列的方式解析字節