MSN机器人-BinaryHeader

最近学习了解了下MSN机器人头像显示部分的资料,协议资料地址http://msnpiki.msnfanatic.com/index.php/MSNC:Display_pictures

在MSN协议中,图像显示采用的是p2p协议。

下面这段代码用于解析和生成p2p数据包中的BinaryHeader部分。

/**
*
*/
package com.msnbot.entity;


/**
* @author jjhuang
*
*/
public class BinaryHeader {

private int sessionId;

private int identifier;

private long dataOffset;

private long totalDataSize;

private int messageLength;

private int flag;

private int AKLIdentifier;

private int AKLUniqueId;

private long AKLDataSize;

public int getSessionId() {
return sessionId;
}

public void setSessionId(int sessionId) {
this.sessionId = sessionId;
}

public int getIdentifier() {
return identifier;
}

public void setIdentifier(int identifier) {
this.identifier = identifier;
}

public long getDataOffset() {
return dataOffset;
}

public void setDataOffset(long dataOffset) {
this.dataOffset = dataOffset;
}

public long getTotalDataSize() {
return totalDataSize;
}

public void setTotalDataSize(long totalDataSize) {
this.totalDataSize = totalDataSize;
}

public int getMessageLength() {
return messageLength;
}

public void setMessageLength(int messageLength) {
this.messageLength = messageLength;
}

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

public int getAKLIdentifier() {
return AKLIdentifier;
}

public void setAKLIdentifier(int identifier) {
AKLIdentifier = identifier;
}

public int getAKLUniqueId() {
return AKLUniqueId;
}

public void setAKLUniqueId(int uniqueId) {
AKLUniqueId = uniqueId;
}

public long getAKLDataSize() {
return AKLDataSize;
}

public void setAKLDataSize(long dataSize) {
AKLDataSize = dataSize;
}

public void parse(byte[] data){
if(data.length<48) throw new RuntimeException("byte[] length isnt fit for parse,must not less than 48");
sessionId = BinaryHeader.getIntValue(data, 0, 4);
identifier = BinaryHeader.getIntValue(data, 4, 4);
dataOffset = BinaryHeader.getLongValue(data, 8, 8);
totalDataSize = BinaryHeader.getLongValue(data, 16, 8);
messageLength = BinaryHeader.getIntValue(data, 24, 4);
flag = BinaryHeader.getIntValue(data, 28, 4);
AKLIdentifier = BinaryHeader.getIntValue(data, 32, 4);
AKLUniqueId = BinaryHeader.getIntValue(data, 36, 4);
AKLDataSize = BinaryHeader.getLongValue(data, 40, 8);
}

public static int getIntValue(byte[] data,int offSet,int length){
int ret = 0;
for (int i = offSet+length-1; i >= offSet; i--) {
int posShiff = 8*(i-offSet);
if(posShiff>0){
ret += ((int)(data[i]&0xff)) << posShiff;
}else ret += (int)(data[i]&0xff);
}
return ret;
}
public static long getLongValue(byte[] data,int offSet,int length){
long ret = 0;
for (int i = offSet+length-1; i >= offSet; i--) {
int posShiff = 8*(i-offSet);
if(posShiff>0){
ret += ((long)(data[i]&0xff)) << posShiff;
}else ret += (long)(data[i]&0xff);
}
return ret;
}

public byte[] getBytes(){
byte[] data = new byte[48];
//sessionId
data[0] = (byte)( sessionId & 0xff);
data[1] = (byte)((sessionId>>8) & 0xff);
data[2] = (byte)((sessionId>>16) & 0xff);
data[3] = (byte)((sessionId>>24) & 0xff);

//identifier
data[4] = (byte)( identifier & 0xff);
data[5] = (byte)((identifier>>8) & 0xff);
data[6] = (byte)((identifier>>16) & 0xff);
data[7] = (byte)((identifier>>24) & 0xff);

//dataOffset
data[8] = (byte)( dataOffset & 0xff);
data[9] = (byte)((dataOffset>>8) & 0xff);
data[10] = (byte)((dataOffset>>16) & 0xff);
data[11] = (byte)((dataOffset>>24) & 0xff);
data[12] = (byte)( dataOffset>>32 & 0xff);
data[13] = (byte)((dataOffset>>40) & 0xff);
data[14] = (byte)((dataOffset>>48) & 0xff);
data[15] = (byte)((dataOffset>>56) & 0xff);

//totalDataSize
data[16] = (byte)( totalDataSize & 0xff);
data[17] = (byte)((totalDataSize>>8) & 0xff);
data[18] = (byte)((totalDataSize>>16) & 0xff);
data[19] = (byte)((totalDataSize>>24) & 0xff);
data[20] = (byte)( totalDataSize>>32 & 0xff);
data[21] = (byte)((totalDataSize>>40) & 0xff);
data[22] = (byte)((totalDataSize>>48) & 0xff);
data[23] = (byte)((totalDataSize>>56) & 0xff);

//messageLength
data[24] = (byte)( messageLength & 0xff);
data[25] = (byte)((messageLength>>8) & 0xff);
data[26] = (byte)((messageLength>>16) & 0xff);
data[27] = (byte)((messageLength>>24) & 0xff);

//flag
data[28] = (byte)( flag & 0xff);
data[29] = (byte)((flag>>8) & 0xff);
data[30] = (byte)((flag>>16) & 0xff);
data[31] = (byte)((flag>>24) & 0xff);

//AKLIdentifier
data[32] = (byte)( AKLIdentifier & 0xff);
data[33] = (byte)((AKLIdentifier>>8) & 0xff);
data[34] = (byte)((AKLIdentifier>>16) & 0xff);
data[35] = (byte)((AKLIdentifier>>24) & 0xff);

//AKLUniqueId
data[36] = (byte)( AKLUniqueId & 0xff);
data[37] = (byte)((AKLUniqueId>>8) & 0xff);
data[38] = (byte)((AKLUniqueId>>16) & 0xff);
data[39] = (byte)((AKLUniqueId>>24) & 0xff);

//AKLDataSize
data[40] = (byte)( AKLDataSize & 0xff);
data[41] = (byte)((AKLDataSize>>8) & 0xff);
data[42] = (byte)((AKLDataSize>>16) & 0xff);
data[43] = (byte)((AKLDataSize>>24) & 0xff);
data[44] = (byte)( AKLDataSize>>32 & 0xff);
data[45] = (byte)((AKLDataSize>>40) & 0xff);
data[46] = (byte)((AKLDataSize>>48) & 0xff);
data[47] = (byte)((AKLDataSize>>56) & 0xff);

return data;
}

public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("sessionId:");
sb.append(sessionId);
sb.append("\n\r");

sb.append("identifier:");
sb.append(identifier);
sb.append("\n\r");

sb.append("dataOffset:");
sb.append(dataOffset);
sb.append("\n\r");

sb.append("totalDataSize:");
sb.append(totalDataSize);
sb.append("\n\r");

sb.append("messageLength:");
sb.append(messageLength);
sb.append("\n\r");

sb.append("flag:");
sb.append(flag);
sb.append("\n\r");

sb.append("AKLIdentifier:");
sb.append(AKLIdentifier);
sb.append("\n\r");

sb.append("AKLUniqueId:");
sb.append(AKLUniqueId);
sb.append("\n\r");

sb.append("AKLDataSize:");
sb.append(AKLDataSize);
sb.append("\n\r");

return sb.toString();
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值