我正在用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);
}
我误解了什么?
答案 0 :(得分:2)
而不是滚动自己的,Guava已经获得了无符号值的辅助方法 - UnsignedInts
,UnsignedLongs
等(有关更多信息,请参阅their wiki),并且有内置方法也可以使用Java 8 - parseUnsignedInt
,divideUnsigned
等
答案 1 :(得分:0)
public static long u(int n)
{
return n & 0xffffffffL;
}
如果您需要的是对无符号值进行算术运算,并且使用哪个版本的java并不重要,我建议使用java 8,因为它有Long,Integer,Byte和Short类中的方法做这种未签名的操作。