`
waterdh
  • 浏览: 95941 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MSN机器人-BinaryHeader

PHP 
阅读更多
最近学习了解了下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();
	}
	
}


1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics