我必须将我的一个代码段从C转换为java。代码如下。
union commandString{
char commndStr[20];
struct{
char commnd[4];
char separator1;
char agr1[5];
char separator2;
char arg2[3];
char separator3;
char additionalArg[5];
};
};
我不想使用任何显式解析器,或者我不想使用
System.arraycopy
方法。 有没有办法以我喜欢的方式做到这一点?
答案 0 :(得分:9)
Java语言不像C这样的语言直接支持联合或直接控制内存布局。
然而,Oracle确实提供了一个在Java 5中添加的后门,可以通过使用sun.misc.Unsafe类来使用。这需要一些工作,Martin Thompson在blog上记录了完整的细节。
另一种选择是用C语言编写它,并通过JNI从Java访问它作为本机函数。
答案 1 :(得分:2)
执行Struct and Union的最佳库将是Javolutions,它已存在多年。这些都是为了做到这一点。
我建议如果你打算使用这些不安全的东西,你将它包装在一个抽象它的库中。这可以避免持续遇到导致JVM崩溃的错误(我的意思是C程序员会理解的崩溃)
我有一个名为Java-Lang的库,它允许您执行Java通常不允许的事情,例如63位大小的堆和内存映射,线程安全的堆操作,JVM之间的内存共享在同一台机器上。正如我所说,我使用自己的库来抽象使用Unsafe。
答案 2 :(得分:1)
阅读有关Javolution联合的信息后,我想到了ByteBuffer,它可以用作联合。作为只有一个提供的类的抽象类,您可能需要使用File.createTempFile(),RandomAccessFile(File,“ rw”),FileChannel RandomAccessFile.getChannel(),MappedByteBuffer FileChannel.map()创建一个临时文件。 。它具有用于控制字节与其他类型的大尾数关系(默认)还是小尾数关系的控件。如果您只需要一个Union即可将类型映射到字节,例如trie,就足够了。