Java中的字节?

Java中的字节?,java,Java,感谢所有以上的答案,但这并不能很好地帮助我,只是为了让我知道我到底想做什么:我正在为某种数据包编码,它有不同的字段,不同的字节长度 所以field1是2字节长field2是3字节长field3是6字节长当我把这些字段加起来的时候,我应该得到11字节长 但是我不知道如何声明这个字节长的东西 请帮助…提前感谢使用阵列: byte[] byteArray = new byte[11]; 关于: byte[] arr = new byte[11]; 我发现java.nio.ByteBuffer通常更

感谢所有以上的答案,但这并不能很好地帮助我,只是为了让我知道我到底想做什么:我正在为某种数据包编码,它有不同的字段,不同的字节长度

所以field1是2字节长field2是3字节长field3是6字节长当我把这些字段加起来的时候,我应该得到11字节长

但是我不知道如何声明这个字节长的东西

请帮助…提前感谢使用阵列:

byte[] byteArray = new byte[11];
关于:

byte[] arr = new byte[11];

我发现java.nio.ByteBuffer通常更适合做这类事情。它有很好的方法来解释缓冲区中的字节。这些文件是


查看文档,看看一些不错的方法,比如
getInt()
getChar()

Java有一个有限的基本类型集合,它们都有固定的大小。你可以看到它们的列表。这意味着您无法决定变量将由多少字节组成


当然,正如其他人已经提到的,您总是可以创建一个
新字节[11]
。但是请注意,Java的
字节
是有符号的。它从-128到127,而不是从0到255。

您可以使用类来表示数据包:

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中处理的消息与您需要读/写的线级格式分开

e、 g.如果你有一个ScreenResolution概念,你可以用java用ScreenResolution类来表示它:

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中的表示与外部表示分离,并使用字节+一些基本的位修改来组装外部表示中的字段。

通过“所有上述答案”,他意味着关于这个问题的答案不应该是它自己的问题;改为编辑原始文件。为此,您需要使用创建另一个问题时使用的同一帐户登录(目前用户ID为134939和135155),查看是否需要帮助。您可能希望将此问题的名称更改为“在Java中设计字节级别的协议”。Idk。。。“Java中的字节?”真的很糟糕。在这一点上,一切都是一团糟。您应该编辑原始问题,但您的问题的措辞方式,它们是如此不同。坦率地说,他们两人都可以改名。人们是否因为这个问题被分为两个帖子而对此投了反对票?除此之外,这是一个完全合法的问题。此外,在你制定你自己的协议和东西来解析和解释它之前,你可能想看看谷歌的协议缓冲区:。它们听起来好像可以完成任务,处理协议消息的代码也不那么麻烦。它确实在您的代码中添加了更多依赖项,例如(您需要调用一个协议缓冲区编译器),但我发现它们很容易使用:-)。。。我错过什么了吗。。。java中的“struct”??另外,对实际的ByteBuffer进行管理,并围绕它创建一个包装器类,不是更好吗?您可以使用packet.getInt(),而不是使用get()和填充字节数组;packet.getChar();等等,不管包中嵌套了什么类型。哎哟-我开始用C#回答,然后切换到Java。我已经知道字节原语,但现在想想,我想知道我们是否可以用它来实现uint类。。。
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;
}