gpt4 book ai didi

java - 在 Java 中实现 C 风格的位域

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:15 26 4
gpt4 key购买 nike

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

我正在尝试用 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 的遗留应用程序进行通信的代码。

我没有重写代码的选项。我知道这种方法不可移植,存在字节顺序问题(和填充/对齐等),如果我能够重写代码,可以用更好的方法来完成。不幸的是,我需要这个非常具体的问题的答案。该系统是封闭的,所以我不需要担心编译器/操作系统/等等的每一个可能的组合。

使用 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;
}
}

关于java - 在 Java 中实现 C 风格的位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com