1

我想从 udp 数据包中读取 1 位。

udp 数据包如下所示(c 代码):

struct typedef struct s_foo
{
   __u32 foo;
   __u8  bar:1,
         bob:1;
} __attribute__((packed)) s_foo;

我如何在java中阅读这个?

到目前为止,我有这个,但我无法阅读 foo 或 bar 或 bob ......

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

public class BroadcastListener
{
    public static void main(String[] args) throws IOException
    {
        if (args.length != 1) {
            System.out.println("usage: <program> port");
            System.exit(1);
        }

        int port = Integer.parseInt(args[0]);
        DatagramSocket dgram = new DatagramSocket(port);

        byte[] buffer = new byte[2048];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        while (true) {
            dgram.receive(packet);

            String msg = new String(buffer, 0, packet.getLength());

            System.out.println(packet.getAddress().getHostName() + ": "
                    + msg);

            packet.setLength(buffer.length);
        }
    }
}
4

1 回答 1

2

要测试一下,您必须使用按位运算符示例:

这将测试该值是否设置了位 0b00001000

boolean result = value & 0x0A;

这将返回位 0b00001000 的内容

int 值 = 值 & ~0x0A;

这是一个可以帮助您的链接:http: //vipan.com/htdocs/bitwisehelp.html

编辑 :

一次读取两位:

int nMask = 0x1A; // 0b00011000

nValue = nValue & nMask;
nValue = nValue >> 3;

nValue will contain bits at 0b00000011
于 2012-11-21T02:22:51.607 回答