为什么我不能将signed int转换为unsigned long

时间:2015-09-18 13:48:37

标签: java io binary hex

我正在用Java中的文件读取数字数据:

一个字节长度的数据代表unsigned byte 两个字节长度的数据代表unsigned short 四个字节长度的数据表示unsigned int

但是因为Java 7没有无符号类型,我需要使用short / integer来表示整个字节值范围,integer表示一个短值我假设long代表一个整数值。

但是我遇到了表示整数值的问题

我有这三种方法:

 public class Utils 
 { 
    public static int u(short n)
    {
        return n & 0xffff;
    }


    public static int u(byte n)
    {
        return n & 0xff;
    }

     public static long u(int n)
    {
        return n & 0xffffffff;
    }
}

和三个测试用例,但只有前两个测试用例有效:

public void testByteToUnsignedIntConversion()
    {
        byte maxByte = (byte)0xff;
        int  maxNotConverted = maxByte;
        int  maxConverted    = Utils.u(maxByte);
        System.out.println(maxConverted + ":" + maxNotConverted);
        assertEquals(255,maxConverted);
    }

    public void testShortToUnsignedIntConversion()
    {
        short maxShort = (short)0xffff;
        int  maxNotConverted = maxShort;
        int  maxConverted    = Utils.u(maxShort);
        System.out.println(maxConverted + ":" + maxNotConverted);
        assertEquals(65535,maxConverted);
    }

    public void testIntToUnsignedLongConversion()
    {
        int maxInt = 0xffffffff;
        long  maxNotConverted = maxInt;
        long  maxConverted    = Utils.u(maxInt);
        System.out.println(maxConverted + ":" + maxNotConverted);
        assertEquals(4294967296l,maxConverted);
    }

我误解了什么?

2 个答案:

答案 0 :(得分:2)

而不是滚动自己的,Guava已经获得了无符号值的辅助方法 - UnsignedIntsUnsignedLongs等(有关更多信息,请参阅their wiki),并且有内置方法也可以使用Java 8 - parseUnsignedIntdivideUnsigned

答案 1 :(得分:0)

除非另有说明,否则按位和(&)将操作数作为整数处理。这就是为什么它使用byte和short,因为这些方法返回一个整数。所以既然你希望结果是一个很长的值来处理它作为无符号值,你应该使用整数最大值掩码(即2 ^ 32-1或0xFFFFFFFF)并将其转换为长整数。长常量应该在java中以L结尾,因此只需将其修改为以下内容:

public static long u(int n)
{
    return n & 0xffffffffL;
}

如果您需要的是对无符号值进行算术运算,并且使用哪个版本的java并不重要,我建议使用java 8,因为它有Long,Integer,Byte和Short类中的方法做这种未签名的操作。

相关问题