UDP解析

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ParseDate {

    public static void main(String[] args) throws IOException {
        // 调用静态方法Recv();
        Recv();
    }

    public static void Recv() throws IOException {
        System.out.println("接收开始......");
        DatagramSocket ds = new DatagramSocket(40001);// 创建DatagramSocket实例,其中DatagramSocket类用于创建接收和发送UDP的Socket实例,40001是端口号
        while (true) {
            // 接收数据的buf数组并指定大小
            byte[] buf = new byte[46];
            // 创建接收数据包,存储在buf中
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            // 接收操作
            ds.receive(dp);
            // 帧头,占4字节,字节数组转换为字符串类型
            String locl = (String.valueOf((char) (buf[0]))
                    + String.valueOf((char) (buf[1]))
                    + String.valueOf((char) (buf[2])) + String
                    .valueOf((char) (buf[3])));
            // 长度(不包括帧头长度),占两个字节,字节数组转换为整数类型数据
            int headLength = ((int) (buf[4]) + (int) (buf[5] << 8));
            
            // 类型,占两个字节,字节数组转换为整数类型数据
            int dateType = ((int) (buf[6]) + (int) (buf[7] << 8));
            
            // 楼层,占两个字节,字节数组转换为整数类型数据
            int floor = ((int) (buf[8]) + (int) (buf[9] << 8));
            
            // 标签ID,占两个字节,字节数组转换为整数类型数据
            int tagId = ((int) (buf[10]) + (int) (buf[11] << 8)
                    + (int) (buf[12] << 16) + (int) (buf[13] << 24));
            
            // X坐标,占八个字节,调用方法bytesToLong(byte[] b),把字节数组转换为小数点类型
            byte[] tempByte = new byte[8];
            for (int i = 0, n = 14; i < tempByte.length; i++, n++) {
                tempByte[i] = buf[n];
            }
            double Xpos = Double.longBitsToDouble(bytesToLong(tempByte));
            
            // Y坐标,占八个字节,调用方法bytesToLong(byte[] b),把字节数组转换为小数点类型
            for (int i = 0, n = 22; i < tempByte.length; i++, n++) {
                tempByte[i] = buf[n];
            }
            double Ypos = Double.longBitsToDouble(bytesToLong(tempByte));
            
            // Z坐标,占八个字节,调用方法bytesToLong(byte[] b),把字节数组转换为小数点类型
            for (int i = 0, n = 30; i < tempByte.length; i++, n++) {
                tempByte[i] = buf[n];
            }
            double Zpos = Double.longBitsToDouble(bytesToLong(tempByte));
            
            // 保留字节,占八个字节,把字节数组转换为字符串类型
            String KeepByte = (String.valueOf((char) (buf[38]))
                    + String.valueOf((char) (buf[39]))
                    + String.valueOf((char) (buf[40]))
                    + String.valueOf((char) (buf[41]))
                    + String.valueOf((char) (buf[42]))
                    + String.valueOf((char) (buf[43]))
                    + String.valueOf((char) (buf[44])) + String
                    .valueOf((char) (buf[45])));
            String ip = dp.getAddress().getHostAddress();//得到发送数据的ip地址
            int port = dp.getPort();//端口号
        }
    }

    /**
     * 将长度为8的byte数组转换为一个long类型值.
     *
     * @param b
     * @return
     */
    public static long bytesToLong(byte[] b) {
        long l = ((long) b[7] << 56) & 0xFF00000000000000L;
        // 如果不强制转换为long,那么默认会当作int,导致最高32位丢失
        l |= ((long) b[6] << 48) & 0xFF000000000000L;
        l |= ((long) b[5] << 40) & 0xFF0000000000L;
        l |= ((long) b[4] << 32) & 0xFF00000000L;
        l |= ((long) b[3] << 24) & 0xFF000000L;
        l |= ((long) b[2] << 16) & 0xFF0000L;
        l |= ((long) b[1] << 8) & 0xFF00L;
        l |= (long) b[0] & 0xFFL;
        return l;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nifengzhuizhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值