我正在用 Java 编写一段代码(我对 Java 还很陌生),我以前用 C# 编写过。这是 C# 中的代码和示例。
ushort number = 0xAABB; // 43707
byte[] data = new byte[2];
EndianBitConverter.Big.CopyBytes(number, data, 0); // value[0] = 170, value[1] = 187
我在 .NET 中使用自定义位转换器,因为它默认为小端。无论如何,根据我对 java 的了解,如果我想使用与 byte[] 相同的结果,我应该期望我的值 (170 和 187) 小 128 (Byte.MAX_VALUE + 1) 即 (42, 59) - 由于 .net 和 java 的字节类型范围不同。这是我用 Java 编写的以模仿上述逻辑的内容。
public class Ushort {
private int value = 0;
public Ushort(int i) {
value = i - (Short.MAX_VALUE + 1);
}
public int get() {
return value;
}
public byte[] getBytes() {
byte[] result = new byte[]{
(byte) (value >>> 24),
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) value};
return new byte[]{result[2], result[3]};
}
}
但是,当我调用上面的代码时
new Ushort(0xAABB).getBytes()
结果是 [42, -69] 而不是 [42, 59]。最后一个字节比它应该小了 128。我真的需要一些关于如何正确执行此操作以及我的逻辑是否正确的指示。我也需要对 uint、ulong 等做同样的事情,所以我需要正确理解这一点。