将C#代码迁移到Java、无符号短代码和字节数组转换
我正在用Java编写一段代码(我对Java相当陌生),这是我以前用C#编写的。下面是C#中的代码和示例 我在.NET中使用自定义位转换程序,因为它默认为little endian。无论如何,从我对java的理解来看,如果我想使用与byte[]相同的结果,我应该期望我的值(170和187)小于128(byte.MAX_VALUE+1),也就是(42,59)-因为.net和java的byte类型范围不同。 下面是我用Java编写的内容,以模仿我的上述逻辑将C#代码迁移到Java、无符号短代码和字节数组转换,java,.net,bytearray,ushort,Java,.net,Bytearray,Ushort,我正在用Java编写一段代码(我对Java相当陌生),这是我以前用C#编写的。下面是C#中的代码和示例 我在.NET中使用自定义位转换程序,因为它默认为little endian。无论如何,从我对java的理解来看,如果我想使用与byte[]相同的结果,我应该期望我的值(170和187)小于128(byte.MAX_VALUE+1),也就是(42,59)-因为.net和java的byte类型范围不同。 下面是我用Java编写的内容,以模仿我的上述逻辑 public class Ushort {
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等进行同样的操作,因此我需要正确理解这一点。或者我不理解您尝试进行转换的原因,或者它们是错误构思的,这意味着我无法对它们的实现是否存在错误发表意见 java中的类型
byte
与C#中的类型sbyte
完全相同,因此您可以使用sbyte
在C#中进行所有测试,并确保在移植到java之前在那里工作正常
(byte)0xaa = 170
(sbyte)0xaa = -86
(byte)0xbb = 187
(sbyte)0xbb = -69
因此,在Java中,字节数组应该是{-86,-69}。我没有测试它,但我要做的是:
public class Ushort {
private int value = 0;
public Ushort(int i) { // Changed
if (i > 0xFFFF || i < -(0xFFFF))
throws IllegalArgumentException("integer overflow")
value = i;
}
public int get() {
return value;
}
public byte[] getBytes() { // Changed! (Use & 0xFF)
return new byte[]{
(byte) ((value >>> 8) & 0xFF),
(byte) (value & 0xFF)};
}
}
公共类Ushort{
私有int值=0;
公共Ushort(int i){//已更改
如果(i>0xFFFF | | i<-(0xFFFF))
抛出IllegalArgumentException(“整数溢出”)
值=i;
}
公共int get(){
返回值;
}
公共字节[]getBytes(){//已更改!(使用&0xFF)
返回新字节[]{
(字节)((值>>>8)和0xFF),
(字节)(值&0xFF)};
}
}
谢谢,我没有想到sbyte,这就是我所需要的。没关系,我们大家都会遇到这种情况。经过几年的C#编程,有一天我知道了“?”操作符的存在。这段代码给了我正确的结果,但是我必须接受Mike的答案,因为这样解决了我的全部问题。我正在测试和理解从.net到java的字节转换。。。。令人尴尬的是,这更合适:)
public class Ushort {
private int value = 0;
public Ushort(int i) { // Changed
if (i > 0xFFFF || i < -(0xFFFF))
throws IllegalArgumentException("integer overflow")
value = i;
}
public int get() {
return value;
}
public byte[] getBytes() { // Changed! (Use & 0xFF)
return new byte[]{
(byte) ((value >>> 8) & 0xFF),
(byte) (value & 0xFF)};
}
}