Работя върху проект, в който пиша java клиент, комуникиращ с услуга, използваща TCP през SSL връзка. Услугата записва всички съобщения в полетата на клиента в мрежов ред на байтове (big endian) и кодира текст в UTF-8. Клиентът прави същото.
Форматът на съобщението, което клиентът трябва да създаде, за да изпрати до услугата, изглежда така
| 0 | 1 | 2 | 3 |
|------------------------------------------------|
| Header Version | Message Type |
|------------------------------------------------|
| Message Length |
|------------------------------------------------|
| Initial Timestamp |
|------------------------------------------------|
| Future use | Request Flags |
|------------------------------------------------|
- Версия на заглавката - 16 бита без знак - Стойността винаги е 1
- Тип на съобщението - 16 бита без знак
- Дължина на съобщението - 32 бита без знак
- Първоначално времево клеймо - 32 бита без знак
- Запазено - 16 бита без знак - Винаги зададено на 0
- Флаг за заявка - битове [16]
Как да създам тази структура от данни в Java с неподписани int??
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));
}
}
}