将 C# 代码移植到 Java

Port 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 创建 class 使字段私有并在更改其他值时更新 uint/bytes 之外,还有其他解决方案吗?

感谢您的意见。

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

您不能在 Java 中这样做。您的选择是:

  • 将其建模为 byte 数组,并在进行索引复制时降低性能。
  • 将其建模为 int 数组,并使用位移和掩码进行字节操作。
  • 使用本机代码;即用 C 或 C++ 编写加密/解密代码,并使用 JNI 或 JNA 或类似工具从 Java.
  • 调用该代码

您还可以查看 IntBufferByteBuffer 类。这些(IMO)不太可能单独提高加密/解密操作的性能,但是当您将它们与 NIO I/O 组合时(作为老式 I/O + 复制到/从数组复制的替代方案)你可能会获得更好的表现。


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