小编典典

在Java中实现C样式位域

java

我有一个问题,我有点被困住了,一位同事告诉我,这将是寻求帮助的好地方。

我正在尝试在Java中实现C风格的位域。这是一个粗略的示例(目前我还没有实际的代码)。

typedef union
{
  typedef struct
  {
     unsigned short a :1;
     unsigned short b :1;
     unsigned short c :2;
     unsigned short d :10;
  } bitfield;

  unsigned short bitmap;
}example_bitfield;

我有很多来自遗留代码的类似样式的位域。我需要提出一种等效的Java方法的原因是,我正在开发将使用Java与其他使用UDP的旧应用程序进行通信的代码。

我没有重写代码的选择。我知道这种方法不是可移植的,存在字节序问题(以及填充/对齐等),并且如果我能够重写代码,可以采用更好的方法。不幸的是,我需要针对这个非常具体的问题的答案。系统是封闭的,因此我不必担心编译器/操作系统/
ect的每种可能组合。

使用Java EnumSet的方法将行不通,因为我相信这只会将每个值设为一位。我需要能够将d的值打包(例如占用10位)。

我了解Java Bitset,但是它有局限性。我使用的是Java的较旧版本,因此我没有一些较新的Java
Bitset方法(即valueOf方法可能肯定会有所帮助)。

是否有人对如何使其尽可能易于管理有任何想法?我的通讯需要实现10多个位域。

感谢您提供任何帮助!


阅读 217

收藏
2020-11-19

共1个答案

小编典典

由于UDP只接受字节数组,因此可以以任何合适的方式声明java类,并且唯一的关键步骤是定义序列化和反序列化方法:

class example_bitfield {
  byte a;
  byte b;
  byte c;
  short d;

  public void fromArray(byte[] m) {
    byte b0=m[0];
    byte b1=m[1];
    a=b0>>>7;
    b=(b0>>6)&1;
    c=(b0>>4)&3;
    d=(b0&0xF<<6)|(b1>>>2);
  }
  public void toArray(byte[] m) {
    m[0]=(a<<7)|(b<<6)|(c<<4)|(d>>>6);
    m[1]=(d&0x3F)<<2;
  }
}
2020-11-19