以下问题:我有一个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,还有其他解决方案吗?
感谢您的投入。
答案 0 :(得分:3)
我假设上面的结构实际上用于将(有效)位数组叠加为byte
数组或int
数组。
你不能用Java做到这一点。您的选择是:
byte
数组,并在进行索引复制时获取性能。int
数组,并使用位移和屏蔽来执行逐字节操作。您还可以查看IntBuffer
或ByteBuffer
类。这些(IMO)不太可能提高您的加密/解密操作的性能,但是当您将它们与NIO I / O结合使用时(作为旧式I / O +复制到阵列之间的替代方法),您可能会变得更好性能
但值得指出的是,这一切都有过早优化的气味。我建议首先以最简单的方式编写Java代码,并在以后担心性能......如果测量结果告诉您这是真正的问题。