如何在Java中表示它

How to represent this in Java

本文关键字:表示 Java      更新时间:2023-10-16
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....的意义是什么?请解释一下。由于

这些是c中的位域。这种结构几乎不可能像在Java中那样表示。您必须编写方法来访问单个位,尽管您可以直接公开底层int。

就用Java的方式,像getM()setM()。当然你得写他们的代码。

结构描述了一个位表。前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);
    }
}

表示unsigned int占用的位数

对于m, d, c, i, mj,您可以使用字节(最大8位)数据类型(您也可以使用c作为布尔值),但ip至少需要一个短(最大16位)。

这是一种将数据打包到特定位数的方法,可以节省非常少量的空间。

你必须使用更大的类型,8位或16位宽。

没有名称的元素只是显式填充。指定的位数会被跳过,这里并不需要,因为下一个元素无论如何都会按字节对齐。

class Struct from Javolution library make what you need (http://www.javolution.org/apidocs/index.html?javolution/io/Struct.html)参见"Clock"示例:

 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();
 }