作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在一个项目中工作,我需要读取一些值并通过套接字连接发送。这是我必须创建的包的格式:
我必须读取这些值(我不知道每个值必须是哪种类型,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/
我是一名优秀的程序员,十分优秀!