UDP接收解析数据包--byte数组转换问题

在使用linux服务器接收数据包时,接受的是一个byte类型的数组。所以当我们对这个数组进行解析时,会根据不同字段的大小来选择合适的类型去进行转换。

比如8位的字段就应该转为byte类型。

比如16位的字段就应该转为short类型。

比如32位的字段就应该转为int类型。

比如64位的字段就应该转为long类型。

那byte数组与其他类型应该怎么转换呢?

1.byte[] -> short类型

// byte数组转short src是byte数组名 offset是开始索引
	public static short bytesToShort(byte[] src, int offset) {
		short value;
		value = (short) (((src[offset + 1] & 0xFF) << 8) | (src[offset + 0] & 0xFF));
		return value;
	}

2.byte[] -> int类型

// byte数组转int  src是byte数组名 offset是开始索引
	public static int bytesToInt(byte[] src, int offset) {
		int value;
		value = (int) ((src[offset + 3] & 0xFF << 24) | ((src[offset + 2] & 0xFF) << 16)
				| ((src[offset + 1] & 0xFF) << 8) | ((src[offset + 0] & 0xFF) << 0));
		return value;
	}

3.byte[] -> long类型

// byte数组转long  src是byte数组名 offset是开始索引
	public static long bytesToLong(byte[] src, int offset) {
		long value;
		value = (long) (((long) src[offset + 7] & 0xFF << 56) | ((src[offset + 6] & 0xFF) << 48)
				| ((long) src[offset + 5] & 0xFF << 40) | ((src[offset + 4] & 0xFF) << 32)
				| ((long) src[offset + 3] & 0xFF << 24) | ((src[offset + 2] & 0xFF) << 16)
				| ((src[offset + 1] & 0xFF) << 8) | ((src[offset + 0] & 0xFF) << 0));
		return value;
	}

还有一种情况,就是你需要转换的这个数据是不能带负数的,比如ip,port,这时就需要转换成无符号类型了。

//无符号整数的转换
	public static long getUnsignedInt(int num){
		return num &0xFFFFFF;
	}
	public static int  getUnsignedShort(short num){
		return num &0xFFFF;
	}
	public static int getUnsignedByte(byte num){
		return num &0x0FF;
	}
喜欢的朋友点个赞哦~~



你可能感兴趣的:(Java)