Java:如何创建包含字节的包?

Java:如何创建包含字节的包?,java,encryption,header,Java,Encryption,Header,我在一个项目中工作,我需要读取一些值并通过套接字连接发送。 这是我必须创建的包的格式: 我必须阅读这些值(我不知道每个值、int或string等的类型): 类型:操作类型(如何仅获取4位?) 已预留:我将填充0 来源:谁在发送消息 接收者:谁来接收信息 算法:哪种算法是用于加密消息的goona 填充:在加密算法中使用它 模式:要加密的模式 我必须读取这些值并创建这个只有7个字节的包 我该怎么做 我想一定是这样的: byte[] r = new byte[]{ ty

我在一个项目中工作,我需要读取一些值并通过套接字连接发送。 这是我必须创建的包的格式:

我必须阅读这些值(我不知道每个值、int或string等的类型): 类型:操作类型(如何仅获取4位?) 已预留:我将填充0 来源:谁在发送消息 接收者:谁来接收信息 算法:哪种算法是用于加密消息的goona 填充:在加密算法中使用它 模式:要加密的模式

我必须读取这些值并创建这个只有7个字节的包

我该怎么做

我想一定是这样的:

byte[] r = new byte[]{
               type+reserverd, 
               origin_1_byte, origin_2_byte, 
               receiver_1_byte, receiver_2_byte, 
               algorithm+padding, 
               mode};
更新:

ByteBuffer buffer = ByteBuffer.allocate(100);
// read data into buffer
buffer.rewind();
buffer.order(ByteOrder.LITTLE_ENDIAN);
// 0xf and co mask off sign extension -> handle byte as unsigned
int type = (buffer.get() >> 4) & 0xf; // 15 in decimal

buffer.rewind();
buffer.put((byte)(type << 4));
System.out.println("type = " + type);


output : 0 (why ?)
ByteBuffer buffer=ByteBuffer.allocate(100);
//将数据读入缓冲区
buffer.rewind();
buffer.order(ByteOrder.LITTLE_ENDIAN);
//0xf和co掩码关闭符号扩展->将字节处理为无符号
int type=(buffer.get()>>4)&0xf;//十进位15
buffer.rewind();
put((字节)(类型查看

还可以查看位操作,例如“移位”。如果需要将3存储到
类型中,将7存储到
保留中,则只需通过移位将它们存储到8位的
字节中

byte typeReserved = (3 << 4) | 7;

只需使用ByteBuffer和nio包。这样,您就可以轻松地从网络读取数据,而不必担心持久性(这很重要!如果您使用streams,您几乎必须自己实现转换-尽管这可能是一个很好的练习)。别忘了将缓冲区endianness设置为正确的值。我们在内部使用int,因为a)所有数学运算都返回int,b)您可以将值作为无符号处理

    ByteBuffer buffer = ByteBuffer.allocate(100);
    // read data into buffer
    buffer.rewind();
    buffer.order(ByteOrder.LITTLE_ENDIAN);
            // 0xf and co mask off sign extension -> handle byte as unsigned
    int type = (buffer.get() >> 4) & 0xf; 
    int origin = buffer.getShort() & 0xffff;
    int receiver = buffer.getShort() & 0xffff;
    // and so on
要将数据写回,您的操作大致相反:

    ByteBuffer buffer = ByteBuffer.allocate(100);
    buffer.rewind();
    buffer.put((byte)(type << 4));
    buffer.putShort((short)origin);
    // and so on

我在使用字节时也遇到了同样的问题,而且我发现Java中没有“无符号字节”,所以如果我正确的话,字节值只能从-128变为127。我不得不像使用字节一样使用短裤,所以我可以使用最多255个值


虽然我相信有办法,但当时我没有足够的时间来解决这个问题

你应该使用位移位(使用其他答案中建议的ByteBuffer或DataOutputStream。

在内部使用整数并屏蔽符号扩展名。唯一有问题的数据类型是无符号64位值,其中您几乎必须使用BigInteger。谢谢您的帮助,但我不会再获得原始值。@Valter那么您得到的值到底是什么?F首先,确保读取第一个位置的buffer.get()返回一个包含正确数据的字节(类型| reserved)。如果不是这样,那么问题就在您读取数据之前。最好发布一个包含ByteBuffer代码的新问题(包括从网络/文件中读取数据的部分)。请将从网络中读取数据的代码添加到ByteBuffer中。似乎您试图从ByteBuffer中读取从未存储在ByteBuffer中的数据-这显然无法工作;)哥们,这看起来很难…对不起,我对java有点陌生,所以我不知道如何在我的服务器套接字中发送和接收。我在clint中用printStream发送,用bufferedReader接收..对不起,我不想打扰你。没问题,没问题-每个人都开始新的。也许最好的办法是阅读像这里这样的快速教程对于java NIO包,这在一小段中解释了基础知识是如何工作的。我将在回答中添加重要部分。谢谢你,伙计,我认为最好开始学习你推荐的教程。=)
    ByteBuffer buffer = ByteBuffer.allocate(100);
    buffer.rewind();
    buffer.put((byte)(type << 4));
    buffer.putShort((short)origin);
    // and so on
InputStream is = socket.getInputStream();
ReadableByteChannel source = Channels.newChannel(istream);
ByteBuffer buffer = ByteBuffer.allocateDirect(headerSize);
source.read(buffer);
// now header is in buffer and can be used as seen above. 
new byte[]{
           type<<4|reserverd, 
           origin_1_byte, origin_2_byte, 
           receiver_1_byte, receiver_2_byte, 
           algorithm<<4 | padding, 
           mode};