2012-09-17 79 views
3

我試圖使一個可靠的UDP系統和I需要轉換字節[]到int和背面(JCreator的5.0 LE)需要4個字節的數組轉換成一個int

DatagramPacket的需要在其數據字節[]形式,所以我爲int信息轉換成字節[],所以我可以發送它:

byte[] data = new byte[48]; 

System.arraycopy(task.getProtocol().byteValue(), 0, data, 0, task.getProtocol().byteValue().length); 
System.arraycopy(task.getMessage().byteValue(), 0, data, 4, task.getMessage().byteValue().length); 
System.arraycopy(task.getSequence().byteValue(), 0, data, 8, task.getSequence().byteValue().length); 
System.arraycopy(task.getAcknowledge().byteValue(), 0, data, 12, task.getAcknowledge().byteValue().length); 

for (int i = task.getAcknowledge(); i >= 0 && i > task.getAcknowledge() - 33; i--) { 

    for (Packet j: tasks) { 

     if (j.getSequence() == i) { 

      data[i] = 1; 
      break; 

     } 

    } 

} 

out = new DatagramPacket(data, data.length, ds.getInetAddress(), portNum); 
ds.send(out); 

協議是protocolID

消息是正在發送

「信息」

序列是數據包的序號;發送的第一個分組具有的0的序列,接下來是1,等等

應答是被送回

的分組的確認接下來的部分是32個其他確認。爲了節省內存,它們被壓縮成每個1字節而不是4個字節(int)

現在,當我收到數據包時,我需要將它解包。首先,我需要檢查前4個字節(協議),看看我是否會忽略數據包,但我不知道如何將字節數組轉換爲int。

+3

看在http://stackoverflow.com/questions/1936857/convert-integer-into-byte-array-java – gtgaxiola

+0

還是這個相關[示例](http://stackoverflow.com/a/2212025/230513)。 – trashgod

+0

[link] http://stackoverflow.com/questions/11437203/byte-array-to-int-array http://stackoverflow.com/questions/7619058/convert-a-byte-array-to-integer -in-java-and-vise-versa http:// stackoverflow。com/questions/1026761/how-to-convert-a-byte-array-to-its-numeric-value-java –

回答

0
byte array - > String -> Integer 
  1. 字節數組 - 4個字節;
  2. String - new String(byte array);
  3. Integer - Integer.parseInt(String);
+0

這假定整數的字符串編碼與它將如何存儲在字節數組中相同 - 這是不正確的。例如,'new String(new byte [] {65})'返回'A'。 –

+0

是的,你是對的。我的錯誤。 –

0

那麼,這是一個通用的方法來做到這一點;它是一個32位的大端(通常的「網絡順序」),起始位置數組中的POS':

int out = 0; 
out += 0xFF & data[pos++]; 
out <<= 8; 
out += 0xFF & data[pos++]; 
out <<= 8; 
out += 0xFF & data[pos++]; 
out <<= 8; 
out += 0xFF & data[pos++]; 

但這可適於使用的字節數爲你的整數。我會調用方法來返回'out'。注意由於符號導致的錯誤。 「0xFF &」是爲了避免這些。此外,不知道我得到了< < =正確的事情。

如果他們是小端,有點難度良好:

int out = 0; 
pos += 4; 
out += 0xFF & data[--pos]; 
out <<= 8; 
out += 0xFF & data[--pos]; 
out <<= 8; 
out += 0xFF & data[--pos]; 
out <<= 8; 
out += 0xFF & data[--pos]; 

這些僅僅是一個辦法做到這一點。 (再次聲明:未經)

2

您可以使用

ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN or BIG_ENDIAN); 
bb.position(pos); 
int n = bb.getInt();