如何在java中创建C样式联合?

时间:2014-07-19 05:50:59

标签: java c

我必须将我的一个代码段从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

方法。 有没有办法以我喜欢的方式做到这一点?

3 个答案:

答案 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,就足够了。