有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

端口C#代码转换为Java

以下问题:我有一个c#程序以一种非常低级的方式进行一些反加密。我使用了一个工具,将大部分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之外,还有其他解决方案吗

谢谢你的意见


共 (1) 个答案

  1. # 1 楼答案

    我假设上面的结构实际上用于(有效地)将位数组叠加为byte数组或int数组

    在Java中不能这么做。你的选择是:

    • 将其建模为byte数组,并在执行索引复制时承受性能损失
    • 将其建模为int数组,并使用位移位和掩蔽来执行字节操作
    • 使用本地代码;即在C或C++中加密/解密,使用JNI或JNA或类似的方法从java调用该代码。李>

    您还可以查看IntBufferByteBuffer类。这些(IMO)不太可能提高单独执行的加密/解密操作的性能,但当您将它们与NIO I/O(作为老式I/O+向/从阵列复制)相结合时,您可能会获得更好的性能


    但也值得指出的是,这一切都带有过早优化的味道。我建议先用最简单的方法编写Java代码,然后再考虑性能。。。。如果测量结果告诉你这是一个真正的问题