将4个字节打包成int

mig*_*ash 1 java bit-manipulation

可能重复:
将4个字节转换为int

我正在尝试使用这里找到的一些解决方案将4个字节打包到一个int中,但它似乎不适用于我的一个测试.

这是我正在使用的代码:

public static int pack(int c1, int c2, int c3, int c4)
{
    return (c1 << 24) | (c2 << 16) | (c3 << 8) | (c4);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我在像0x34,0x68,0x77和0x23这样简单的东西上使用它时,我得到了我所期望的:0x34687723.但是当我在0xBA,0xAD,0xBE和0xEF上使用它时,我得到了一些东西.有谁看到问题可能是什么?

编辑

上面的代码能够给我我想要的东西,我在下面提到的"错误值"只是以十进制形式表示0xBAADBEEF的另一种方式.

x4u*_*x4u 9

pack方法中的代码是正确的并保留所有位但由于结果存储在signed int中,当您尝试将其作为int打印或进行算术计算或与之进行比较时,会得到错误的结果.

int result = pack( c1, c2, c3, c4 );
System.out.println( "result=" + Long.toHexString( result & 0xffffffffL );
Run Code Online (Sandbox Code Playgroud)

这将int打印为unsigned int.


Aln*_*tak 6

存储在Java int中的数字只能表示高达0x7fffffff(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;
}
Run Code Online (Sandbox Code Playgroud)

注意最后的显式long掩码操作,这是确保符号扩展不会导致负整数结果变为负long所必需的.