gpt4 book ai didi

java - 如何在JAVA中创建带有无符号整数的数据包

转载 作者:行者123 更新时间:2023-12-01 11:39:56 26 4
gpt4 key购买 nike

我正在开发一个项目,其中我正在编写一个 java 客户端,通过 SSL 连接使用 TCP 与服务进行通信。该服务以网络字节顺序(大端)将所有消息写入客户端字段,并以 UTF-8 编码文本。客户端也做同样的事情。

客户端必须创建以发送到服务的消息格式如下所示

 |    0      |    1     |     2      |     3      |
|------------------------------------------------|
| Header Version | Message Type |
|------------------------------------------------|
| Message Length |
|------------------------------------------------|
| Initial Timestamp |
|------------------------------------------------|
| Future use | Request Flags |
|------------------------------------------------|
  1. header 版本 - 无符号 16 位 - 值始终为 1
  2. 消息类型 -​​ 无符号 16 位
  3. 消息长度 - 无符号 32 位
  4. 初始时间戳 - 无符号 32 位
  5. 保留 - 无符号 16 位 - 始终设置为 0
  6. 请求标志 - 位[16]

如何在 Java 中使用无符号整数创建此数据结构?

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer ;


public class NullMessage {

private final int BASE_HEADER_SIZE = 7;

int _headerVersion;
int _messageType;
long _messageLength;
byte[] _options;


public NullMessage( byte[] format ) {

if (format.length == BASE_HEADER_SIZE) {

_headerVersion = (int)( ( ( format[0] << 8 ) & 652080 ) | ( format[1 ] & 255 ));

_messageType = (int)( ( ( format[2] << 8 ) & 652080 ) | ( format[3] & 255 ));

_messageLength = (long)(((format[4]<<24)&4278190080l)
|((format[5]<<16)&16711680l)
|((format[6]<<8)&65280)
|(format[7]&255));
}
else {
throw new RuntimeException("Error in creating NullMessage format");
}

}

public int length() {
return BASE_HEADER_SIZE + (this._options == null ? 0 : this._options.length );
}


public NullMessage( int headerVersion, int messageType, long messageLength) {
this._headerVersion = headerVersion;
this._messageType = messageType;
this._messageLength = messageLength;
}

public byte[] toByteArray() {

ByteArrayOutputStream out = new ByteArrayOutputStream();

try {
out.write( getHeader() );
if ( _options != null ){
out.write( this._options );
}
} catch (IOException e) {
System.out.println( e.toString() ) ;
}

return out.toByteArray() ;

}

// Generate the NullMessage in a byte array format
public byte[] getHeader() {

byte[] nullMessage = new byte[BASE_HEADER_SIZE];
nullMessage[0] = (byte)((_headerVersion>>8)&255);
nullMessage[1] = (byte)((_headerVersion&255));
nullMessage[2] = (byte)((_messageType>>8)&255);
nullMessage[3] = (byte)((_messageType&255));
nullMessage[3] = (byte)((_messageLength>>24)&255);
nullMessage[4] = (byte)((_messageLength>>16)&255);
nullMessage[5] = (byte)((_messageLength>>8)&255);
nullMessage[6] = (byte)((_messageLength&255));

return nullMessage;
}


public byte[] getOption() {

return _options;
}

public int getHeaderVersion() {
return this._headerVersion;
}

public void setHeaderVersion(int version) {
this._headerVersion = version;
}

public int getMessageType() {
return this._messageType;
}

public void setMessageType(int messageType ) {
this._messageType = messageType;
}

public long getMessageLength() {
return this._messageLength;
}

public void setMessageLength( long messageLength ) {

this._messageLength = messageLength;
}

public void print() {
byte[] head = getHeader();
for (int j=0; j<head.length; j++) {
System.out.format("%08X ", head[j]);
}
System.out.println();
}

public static void main(String args[]){
NullMessage test = new NullMessage(1, 0, 0);
test.print();


byte[] array = test.toByteArray();

for (int i=0;i<array.length;i++) {
System.out.println("myByte["+i+"]:"+ Integer.toBinaryString(array[i] & 255 | 256).substring(1));

}
}

}

最佳答案

使用DataInputStreamDataOutputStream的方法。

关于java - 如何在JAVA中创建带有无符号整数的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29610579/

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