编程语言
首页 > 编程语言> > 端口C#Code to Java

端口C#Code to Java

作者:互联网

以下问题:我有一个c#程序以非常低的方式进行一些de / encryption.我使用了一个工具,将大多数c#代码转换为Java,这对大多数事情都适用,但是当涉及到这种低级别部分时,该工具失败了.内部使用以下数据结构:

[StructLayout(LayoutKind.Explicit)]
        private struct ByteUInt
        {
            [FieldOffset(0)]
            public byte Byte0;

            [FieldOffset(1)]
            public byte Byte1;

            [FieldOffset(2)]
            public byte Byte2;

            [FieldOffset(3)]
            public byte Byte3;

            [FieldOffset(0)]
            public uint FullUint;
        }

在程序中,这个结构中的字节和uint分别改变了几次,例如像这样MyByteUint.Byte0& = someByte;或MyMyteUint.FullUint = someByte& 0x0F或其他一些按位运算.因为uint引用与4个字节相同的内存,如果我改变其中一个,uint也会改变,反之亦然.

由于Java中没有真正的指针,我不知道将这些东西移植到Java的最佳方法,因为我无法直接引用内存.除了使用getter和setter创建一个使字段为私有的类并在更改其他值时更新uint / bytes,还有其他解决方案吗?

感谢您的输入.

解决方法:

我假设上面的结构实际上用于覆盖(有效)位数组作为字节数组或int数组.

你不能用Java做到这一点.你的选择是:

>将其建模为字节数组,并在进行索引复制时获得性能影响.
>将其建模为int数组,并使用位移和屏蔽来执行逐字节操作.
>使用本机代码;即,用C或C编码加密/解密,并使用JNI或JNA或类似方法从Java调用该代码.

您还可以查看IntBuffer或ByteBuffer类.这些(IMO)不太可能提高您的加密/解密操作的性能,但是当您将它们与NIO I / O结合使用时(作为旧式I / O复制到阵列之间的替代方法),您可能会获得更好的性能.

但值得指出的是,这一切都有过早优化的气味.我建议首先以最简单的方式编写Java代码,然后担心性能……如果测量结果告诉你它是一个真正的问题.

标签:c,java,pointers,struct,pointer-arithmetic
来源: https://codeday.me/bug/20190628/1316616.html