我有一个问题,我有点被困住了,一位同事告诉我,这将是寻求帮助的好地方。
我正在尝试在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多个位域。
感谢您提供任何帮助!
由于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; } }