JNA:如何定义具有自定义位大小字段的结构?
JNA: How can I define a structure with fields of custom bit sizes?
比如我有如下C++结构...
struct dleaf_t
{
int contents; // OR of all brushes (not needed?)
short cluster; // cluster this leaf is in
short area : 9; // area this leaf is in
short flags : 7; // flags
short mins[ 3 ]; // for frustum culling
short maxs[ 3 ];
unsigned short firstleafface; // index into leaffaces
unsigned short numleaffaces;
unsigned short firstleafbrush; // index into leafbrushes
unsigned short numleafbrushes;
short leafWaterDataID; // -1 for not in water
//!!! NOTE: for maps of version 19 or lower uncomment this block
/*
CompressedLightCube ambientLighting; // Precaculated light info for entities.
short padding; // padding to 4-byte boundary
*/
};
通常我可以在 Java 中使用 JNA 轻松表示结构,但此结构使用自定义位数作为数据类型(如果我没记错的话)。
例如,area
是 short
的 9 位,而不是通常的 16 位. flags
是 7 位的短...等
如何使用自定义位大小的数据类型定义 JNA 结构?
我不知道 JNA 是否可行。请查看文档,看看是否可以找到有关您的问题的信息。
将两个位字段合并为一个int
字段,然后编写成员方法来提取已合并的各个字段的值,例如
public int area_flags;
public int getArea() { return area_flags & 0x1FF; }
public int getFlags() { return (area_flags >> 9) & 0x3F; }
根据您的编译器打包这些位的方式,您可能需要稍微尝试一下。
比如我有如下C++结构...
struct dleaf_t
{
int contents; // OR of all brushes (not needed?)
short cluster; // cluster this leaf is in
short area : 9; // area this leaf is in
short flags : 7; // flags
short mins[ 3 ]; // for frustum culling
short maxs[ 3 ];
unsigned short firstleafface; // index into leaffaces
unsigned short numleaffaces;
unsigned short firstleafbrush; // index into leafbrushes
unsigned short numleafbrushes;
short leafWaterDataID; // -1 for not in water
//!!! NOTE: for maps of version 19 or lower uncomment this block
/*
CompressedLightCube ambientLighting; // Precaculated light info for entities.
short padding; // padding to 4-byte boundary
*/
};
通常我可以在 Java 中使用 JNA 轻松表示结构,但此结构使用自定义位数作为数据类型(如果我没记错的话)。
例如,area
是 short
的 9 位,而不是通常的 16 位. flags
是 7 位的短...等
如何使用自定义位大小的数据类型定义 JNA 结构?
我不知道 JNA 是否可行。请查看文档,看看是否可以找到有关您的问题的信息。
将两个位字段合并为一个int
字段,然后编写成员方法来提取已合并的各个字段的值,例如
public int area_flags;
public int getArea() { return area_flags & 0x1FF; }
public int getFlags() { return (area_flags >> 9) & 0x3F; }
根据您的编译器打包这些位的方式,您可能需要稍微尝试一下。