⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msginputstream.java

📁 解析特定16进制文件
💻 JAVA
字号:
/**
 * @(#)MsgInputStream.java	06/09/06
 * 
 * COPYRIGHT DaTang Mobile Communications Equipment CO.,LTD
 */

package com.datangmobile.oss.omc.pc.util;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;

import com.datangmobile.oss.platform.util.ILogger;
import com.datangmobile.oss.platform.util.ModuleLogger;

/**
 * 用于读取消息的流
 * @author zhouqi
 *
 * @version 1.1 liuyuan 2007-5-22 修改读取UINT方法,如果为负值,需要进行转换来得到对应的正数值
 */
public class MsgInputStream
{
	
	/**
	 * 日志
	 */
	private static final ILogger logger = ModuleLogger.getPmLogger()
			.getOperLogger();
	
	/**
	 * 用来读取消息的流
	 */
	private DataInputStream dstream;
	private ByteArrayInputStream bstream;
	
	public MsgInputStream(byte[] bytes)
	{
		bstream = new ByteArrayInputStream(bytes);
		dstream = new DataInputStream(bstream);
	}
	
	/**
	 * 读取字符串
	 * @param strLen
	 * @return
	 */
	public String readString(int strLen)
	{
		try
		{
			byte[] bytes = new byte[strLen];
			dstream.readFully(bytes);
			
			/* 可能需要转换字符集,但目前先不转换 */
			String msg = new String(bytes);
			return msg;
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an String data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
		
	}
	
	/**
	 * 读取byte类型
	 * @return
	 */
	public byte readByte()
	{
		try
		{			
			return dstream.readByte();	
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an byte data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}	
	}
	
	/**
	 * 读取Int类型
	 */
	public int readInt()
	{
		try
		{			
			return dstream.readInt();	
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an int data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
	}
	
	/**
	 * 读取short类型
	 * @return
	 */
	public short readShort()
	{
		try
		{			
			return dstream.readShort();	
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an int data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
	}
	
	/**
	 * 读取指定长度的byte数组
	 * @param len
	 * @return
	 */
	public byte[] readBytes(int len)
	{
		try
		{
			byte[] bytes = new byte[len];
			dstream.readFully(bytes);
			return bytes;
			
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read a Byte Array data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}		
	}
	
	/**
	 * 读取无符号int, 因为在c++中存在无符号int.
	 * 而java中没有,所以需要扩充为long来标示读出的无符号int
	 * @return
	 */
	public long readUInt()
	{
		try
		{		
			int val = dstream.readInt(); 
			if(val < 0)
			{
				
				//liuyuan, 2007-5-22 修改读取UINT方法,如果为负值,需要进行转换来得到对应的正数值
				//或者是下面的那个方法,比如如果是byte型变量的话,负值-128的话,就表示128,-1就表示255
				//相当于把最大值加一后再乘以2去加负数,得到相应的正值
//				long ret = (long)val + (((long)Integer.MAX_VALUE) + 1 ) * 2;
				long ret = 0x00000000ffffffffl & (long)val; 
//				long ret = val + 65536*65536; 
				return ret;
			}
			else
			{
				return val;
			}
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an Unisigned Int data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
	}
	
	/**
	 * 读取无符号的short
	 * @return
	 */
	public int readUShort()
	{
		try
		{		
			int val = dstream.readUnsignedShort(); 
			return val;
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an Unisigned Short data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
	}
	
	
	/**
	 * 读取无符号的byte
	 */
	public int readUByte()
	{
		try
		{		
			int val = dstream.readUnsignedByte(); 
			return val;
		}
		catch(Exception ex)
		{
			//--------------------------log
			logger.error("read an Unisigned Byte data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
	}
	/**
	 * 在输入流中跳过数据的 n 个字节,并丢弃跳过的字节
	 * @param n
	 * @return
	 */
	public int skipBytes(int n){
		if(n < 0){
			return -1;
		}
		try{
			int ret = dstream.skipBytes(n);
			return ret;
		}
		catch(Exception ex){
			//--------------------------log
			logger.error("skip n byte data occurs errors!",ex);
			throw new RuntimeException(ex.toString());
		}
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -