typedef struct _dmk {
unsigned short int m : 5; // 0 - 31
unsigned short int d : 5; // 0 - 31
unsigned short int c : 1; // 0 - 1
unsigned short int i : 5; /* 0 - 31 */
unsigned short int ip : 10; /* 0 - 1024 */
unsigned short int mj : 1; // 0 - 1
unsigned short int : 5; /* unused */
char msk[10];
} DMSK;
这里代表什么?我应该使用字节数据类型还是短路会好吗? 同样在最后一个unsigned short int声明中,没有指定变量名。那是什么意思? 5,5,1,5 ......的意义是什么?请解释。谢谢
答案 0 :(得分:2)
这些是C中的位字段。这种结构几乎不可能像在Java中那样表示。您必须编写方法来访问各个位,尽管您可以公开底层的int。
答案 1 :(得分:1)
只需使用Java方式,例如getM()
和setM()
。当然你必须写teir代码。
您的结构描述了一个位表。前5位包含字段m
,接下来的5位(跨越字节边界)包含d
,依此类推。
JFC(Java API)没有可以帮助你的实现,所以如果你经常在你的程序中使用这样的结构,我建议写一个像SlidingInteger
这样可以处理单个字段的类。像这样:
class DMK {
private static final int FIELD_M = 0;
private static final int FIELD_D = 1;
private static final int FIELD_C = 2;
private static final int FIELD_I = 3;
private static final int FIELD_IP = 4;
private static final int FIELD_MJ = 5;
private static final int FIELD_PLACEHOLDER1 = 6;
private SlidingInteger[] fields;
public DMK() {
fields = new SlidingInteger[7];
fields[FIELD_M] = new SlidingInteger(5);
fields[FIELD_D] = new SlidingInteger(5);
fields[FIELD_C] = new SlidingInteger(1);
fields[FIELD_I] = new SlidingInteger(5);
fields[FIELD_IP] = new SlidingInteger(10);
fields[FIELD_MJ] = new SlidingInteger(1);
fields[FIELD_PLACEHOLDER1] = new SlidingInteger(1);
}
public int getM() {
return fields[FIELD_M].getIntValue();
}
public int setM(int newVal) {
fields[FIELD_M].setIntValue(newVal);
}
public int getD() {
return fields[FIELD_D].getIntValue();
}
public int setD(int newVal) {
fields[FIELD_D].setIntValue(newVal);
}
}
答案 2 :(得分:0)
它表示unsigned int
占用的位数。
答案 3 :(得分:0)
对于m,d,c,i,mj,您可以使用字节(最大8位)数据类型(您也可以使用c作为布尔值),但ip至少需要一个短(最多16位)。
答案 4 :(得分:0)
这是一种将数据打包到特定位数的方法,可能会节省很少的空间。
您必须使用下一个更大的类型,8或16位宽。
没有名称的元素只是显式填充。跳过指定的位数,这里不需要,因为下一个元素无论如何都是字节对齐的。
答案 5 :(得分:0)
来自Javolution库的类结构可满足您的需求(http://www.javolution.org/apidocs/index.html?javolution/io/Struct.html)请参阅“时钟”示例:
import java.nio.ByteBuffer;
class Clock extends Struct { // Hardware clock mapped to memory.
Unsigned16 seconds = new Unsigned16(5); // unsigned short seconds:5
Unsigned16 minutes = new Unsigned16(5); // unsigned short minutes:5
Unsigned16 hours = new Unsigned16(4); // unsigned short hours:4
Clock() {
setByteBuffer(Clock.nativeBuffer(), 0);
}
private static native ByteBuffer nativeBuffer();
}