将4个字节打包为一个int [duplicate]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

存储在Java
int
中的数字只能表示最大为ѭ1positive的正值(2147483647,
Integer.MAX_VALUE
),因为它是带符号的类型(就像所有Java数字类型一样),并且在内部表示形式中,最高有效位用作符号一点。 要保持大于的正数值,您需要使用
long
代替:
public static long pack(int c1,int c2,int c3,int c4)
{
        return ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4)) & 0xffffffffL;
}
请注意,最后必须进行显式的“ 3”掩码操作,以确保符号扩展不会导致负整数结果变成负整数。     ,pack方法中的代码正确无误,并保留所有位,但是由于结果存储在带符号的int中,因此当您尝试将其打印为int或进行算术计算或比较时,会得到错误的结果。
int result = pack( c1,c2,c3,c4 );
System.out.println( \"result=\" + Long.toHexString( result & 0xffffffffL );
这会将int打印为无符号int。     ,标志扩展名。在Java中,整数是有符号的,因此0xBA << 24会使人感到不满意。我建议您将其压缩为
long
的最后四个字节。
long temp =
   ((0xFF & c1) << 24) | ((0xFF & c2) << 16) | ((0xFF & c3) << 8) | (0xFF   & c4);

return (int)(temp & 0x0FFFFFFFFL);
    ,你得到一个负数吗?也许一个无符号的int或一个更长的int会更好。