如何在Java中表示它
How to represent this in Java
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();
}
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- 在这种情况下,java对象是否可以调用本机函数
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 在java中读取c++字节的位字段
- 如何计算Big-O表示法中的平均渐近运行时间
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 我应该如何表示我拥有的连续元素序列?
- 查找表示 GPS 路线的两条线(MATLAB、Java、C++ 或 Python)之间的距离
- 如何在Byte Array Java中表示头值和实际消息
- 如何在 Java 中表示静态结构
- 如何在Java中表示它