package com.sprintwind.packetcapturetool; public class ByteTranslater { public static final int BYTE_LEN_OF_INT = 4; public static final int BYTE_LEN_OF_SHORT = 2; public static final int BYTE_LEN_OF_CHAR = 1; public static final int BYTE_BIT_NUM = 8; public static final int INT_BIT_NUM = 32; public static final int MIN_INT_BIT = 0; public static final int MAX_INT_BIT = 31; public static int hostIntFromByte(byte[] array, int start) { if(start + BYTE_LEN_OF_INT > array.length) { return ErrorCode.INVALID_LEN; } int result = 0; for(int i=0; i<4; i++) { result += (array[start+3-i]&0xff) << (24-8*i); } return result; } public static int netIntFromByte(byte[] array, int start) { if(start + BYTE_LEN_OF_INT > array.length) { return ErrorCode.INVALID_LEN; } int result = 0; for(int i=0; i<4; i++) { result += (array[start+3-i]&0xff) << (8*i); } return result; } public static short hostShortFromByte(byte[] array, int start) { if(start + BYTE_LEN_OF_SHORT > array.length) { return (short) ErrorCode.INVALID_LEN; } int result = 0; for(int i=0; i<2; i++) { result += (array[start+1-i]&0xff) << (8-8*i); } return (short) result; } public static short netShortFromByte(byte[] array, int start) { if(start + BYTE_LEN_OF_SHORT > array.length) { return (short) ErrorCode.INVALID_LEN; } int result = 0; for(int i=0; i<2; i++) { result += (array[start+1-i]&0xff) << (8*i); } return (short) result; } public static char charFromByte(byte[] array, int start){ if(start + BYTE_LEN_OF_CHAR > array.length) { return (char) ErrorCode.INVALID_LEN; } return (char)array[start]; } public static int hostBitFromByte(byte[] array, int start, int low, int high){ if(start + BYTE_LEN_OF_INT > array.length) { return ErrorCode.INVALID_LEN; } if((low > high)||(low < MIN_INT_BIT)||(high > MAX_INT_BIT)){ return ErrorCode.INVALID_BIT_RANGE; } int original = hostIntFromByte(array, start); int maskHigh = 0x80000000 >> high; original &= maskHigh; //System.out.println("original1:"+String.format("%x", original)); int maskLow; if(0 == low) { maskLow = 0xffffffff; } else { maskLow = (1 << (INT_BIT_NUM - low)) -1 ; } original &= maskLow; //System.out.println("original2:"+String.format("%x", original)); //System.out.println("maskHigh:"+String.format("%x", maskHigh)+"maskLow:"+String.format("%x", maskLow)); return original; } public static int netBitFromByte(byte[] array, int start, int low, int high){ if( (high/BYTE_BIT_NUM)+start >= array.length) { return ErrorCode.INVALID_LEN; } if( (low > high)||(high > MAX_INT_BIT)){ return ErrorCode.INVALID_BIT_RANGE; } int original = netIntFromByte(array, start); //System.out.println("original:"+String.format("%x", original)); int maskHigh = 0x80000000 >> high; original &= maskHigh; //System.out.println("original1:"+String.format("%x", original)); int maskLow; if(0 == low) { maskLow = 0xffffffff; } else { maskLow = (1 << (INT_BIT_NUM - low)) -1 ; } original &= maskLow; //System.out.println("original2:"+String.format("%x", original)); //System.out.println("maskHigh:"+String.format("%x", maskHigh)+"maskLow:"+String.format("%x", maskLow)); return original >> (INT_BIT_NUM-high-1); } }