gpt4 book ai didi

Java:如何用字节创建一个包?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:37:40 27 4
gpt4 key购买 nike

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

我必须读取这些值(我不知道每个值必须是哪种类型,int 或 string 等):类型:操作类型(如何只得到 4 位?)reserverd : 我会填0来源:谁在发送消息接收者:接收消息的人algorithm:将使用哪种算法来加密消息填充:在加密算法中使用它mode : 加密的模式

我必须读取这个值并创建这个必须只有 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 和 nio 包。这样你就可以轻松地从网络中读取数据,而不必担心字节顺序(这很重要!如果你使用流,你几乎必须自己实现转换——尽管这可能是一个很好的练习)。不要忘记将缓冲区字节顺序设置为正确的值。我们在内部使用整数,因为 a) 所有数学运算无论如何都会返回整数,并且 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

编辑:通常,您会从网络 channel 将数据直接读入 ByteBuffer 并使用 Java NIO 包。快速教程是 here .但由于您已经拥有 Socket,我们会让它变得更容易一些。请注意,为简洁起见,我忽略了所有错误检查。在另一个方向上使用 OutputStream 和 WritableByteChannel(带写入)。

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.

关于Java:如何用字节创建一个包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6255768/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com