[英]Bytes in Java?
感謝上述所有答案,但僅給出一個我想做的事情並沒有真正幫助我:我正在為某種具有不同字段(字節長度不同)的數據包編碼
所以field1是2個字節長field2是3個字節長field3是6個字節長,當我將這些字段加起來時,我應該得到11個字節的長度...
但是我不知道如何聲明這個字節長的東西...
請幫助...提前感謝
使用數組:
byte[] byteArray = new byte[11];
怎么樣:
byte[] arr = new byte[11];
您可以使用一個類來表示您的數據包:
public class Packet
{
public byte[] Field1, Field2, Field3;
public Packet(byte[] packetBytes)
{
ByteBuffer packet = ByteBuffer.wrap(packetBytes);
Field1 = new byte[2];
Field2 = new byte[3];
Field3 = new byte[6];
packet.get(Field1, 0, 2);
packet.get(Field2, 2, 3);
packet.get(Field3, 5, 6);
}
}
ByteBuffer非常適合字節操作。
我發現java.nio.ByteBuffer通常更適合這種情況。 它具有處理緩沖區中字節的好方法。 文檔在這里 。
import java.nio.ByteBuffer;
ByteBuffer buffer = ByteBuffer.allocate(11);
getChar()
出文檔並查看不錯的方法,例如getInt()
和getChar()
。
Java具有有限的原始類型集合,所有原始類型均具有固定大小。 您可以在此處查看它們的列表。 這意味着您無法確定變量將包含多少字節。
當然,正如其他人已經提到的那樣,您始終可以創建一個new byte[11]
。 注意,Java的byte
是帶符號的。 從-128到127,而不是從0到255。
我推薦Javolution中的實用程序類來處理諸如此類的二進制協議流。 在處理低級二進制流時,它們對我來說很方便。
您可能應該設計代碼,以將要在Java中處理的消息與需要讀取/寫入的線路級別格式分開。
例如,如果您有ScreenResolution概念,則可以使用ScreenResolution類在Java中表示它:
public class ScreenResolution {
public int height;
public int width;
}
該類在Java中易於使用。 根據某種文件格式或協議將其轉換為可以在網絡上傳輸/保存到文件等的分組是另一個問題。 假設高度和寬度分別以3個字節布置,並為“ wire format”添加一些ID和長度,則您將
public byte[] marshalScreenResolution(ScreenResolution obj) {
byte[] buf = new byte[9];
//length of this packet, 2 bytes
buf[0] = 0;
buf[1] = 9;
buf[2] = SCREENRESOLUTION_OPCODE;
//marshal the height/width , 3 least significant bytes.
buf[3] = (obj.height&0xff0000) >> 16;
buf[4] = (obj.height&0x00ff00) >> 8;
buf[5] = (obj.height&0x0000ff) ;
buf[6] = (obj.width&0xff0000) >> 16;
buf[7] = (obj.width&0x00ff00) >> 8;
buf[8] = (obj.width&0x0000ff) ;
return buf;
}
然后,您創建了一個demarshalScreenResolution函數,用於從數據包轉到ScreenResolution對象。 關鍵是您將java中的表示形式與外部表示形式分離,然后使用字節+一些基本的位組合來組合外部表示形式中的字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.