2011-05-24 109 views
1

可能重复:
Convert 4 bytes to int包装4个字节为一个int

我想收拾4个字节为一个int使用一些在这里找到了解决方案,但它不” t似乎适用于我的一个测试。

这是我使用的代码:

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

现在,当我使用它像0x34,0x68,0x77,而0×23简单的东西,我得到我所期望的:0x34687723。但是当我在0xBA,0xAD,0xBE和0xEF上使用它时,我得到了一些解决办法。有没有人看到问题可能是什么?

编辑

上面的代码是能够给我我想要的东西,而“错误值”我下面提的是十进制的形式表示0xBAADBEEF的另一种方式。

+2

知道你实际获得的结果是什么也许有用。 :) – sarnold 2011-05-24 22:26:43

+0

不知何故,我迷路了。你能告诉我你为什么每个字节都有这个(0xF​​F&...)吗?我真的很抱歉,不知何故,目前我没有得到它......这是漫长的一天。我真的很感谢有人帮助我,在这里。 – 2011-05-24 22:28:34

+1

@ b.buchhold:我认为这是确保它们实际上是单字节值。不知道为什么参数不仅仅是'byte'类型。 – Ryan 2011-05-24 22:29:52

回答

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; 
} 

注意在这是必要的结束的明确long掩码操作来确保符号扩展不会导致负整数结果从变成负长。

+0

好吧,看起来我的原始代码给了我正确的答案,在我将其转换回十六进制之前,它看起来很奇怪。我不知道它为什么给出了一个奇怪的值,但使用System.out.printf我能够确定值是相同的。谢谢您的帮助! – 2011-05-25 01:00:04

+0

@vaxquis我不同意。请注意,您指出的答案采用了OP的原始函数,但是在打印之前使用_unsigned_位操作将返回值提升为“long”。矿采取替代方法并直接返回“长”。无论如何,尽管语法允许设置最高位的(int)文本,但内部表示仍然会有效地为负数。无论哪种方式,对于实际上按要求工作并且实际上不是“错误”的代码来说,这是一种苛刻的恶意代码。 – Alnitak 2016-01-14 20:48:57

+0

你正在分裂头发,并将我的答案中的值作为位模式读取,而不是“数字”,这是我的意图。 JVM规范本身说范围是-2147483648到2147483647.如果在我的答案中需要澄清,那么仅仅在句子“将值保留在下一位...”(其中I现在已经完成) – Alnitak 2016-01-14 22:04:38

0

您是否得到负数?也许unsigned int或更长的int会更好。

+0

unsigned int?更长的int?我不知道Java有这些类型。 – Kylar 2011-05-24 22:25:03

+0

@Kylar well,'long'是一种“长整型”。当然,不存在无符号类型。 – Alnitak 2011-05-24 22:29:59

0

签名扩展。在Java中,int是有符号的,所以0xBA < < 24得到不满。我建议你打包到long的最后四个字节。

long temp = 
    ((0xFF & c1) << 24) | ((0xFF & c2) << 16) | ((0xFF & c3) << 8) | (0xFF & c4); 

return (int)(temp & 0x0FFFFFFFFL); 
+0

这与原始代码完全相同,只是在长变量上绕行。 (Java不会不高兴,它只是创建一个负数,这不是oexcz期望的。) – 2011-05-24 23:19:57

9

你在包装方法的代码是正确的,并保留所有位,但由于该结果被存储在一个有符号整数你会得到一个错误的结果,当您尝试打印它作为一个int,或当你做算术运算或与它进行比较。

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

这将int值打印为无符号整数。

相关问题