将 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.
调用该代码
您还可以查看 IntBuffer
或 ByteBuffer
类。这些(IMO)不太可能单独提高加密/解密操作的性能,但是当您将它们与 NIO I/O 组合时(作为老式 I/O + 复制到/从数组复制的替代方案)你可能会获得更好的表现。
但同样值得指出的是,这一切都有过早优化的味道。我建议首先以最简单的方式编写 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. 调用该代码
您还可以查看 IntBuffer
或 ByteBuffer
类。这些(IMO)不太可能单独提高加密/解密操作的性能,但是当您将它们与 NIO I/O 组合时(作为老式 I/O + 复制到/从数组复制的替代方案)你可能会获得更好的表现。
但同样值得指出的是,这一切都有过早优化的味道。我建议首先以最简单的方式编写 Java 代码,然后再考虑性能......如果测量结果告诉您这是一个真正的问题。