Java:将字节转换为整数

16

我需要在Java中将2字节数组(byte[2])转换为整数值。如何实现?


5
这个问题需要进一步澄清。目前来看,我们只能通过你选择的答案来理解你的意思。 - Victor Zamanian
2
这个回答解决了你的问题吗?如何将两个字节读入一个整数? - David Krell
6个回答

26
你可以使用 ByteBuffer 来实现这个功能:
ByteBuffer buffer = ByteBuffer.wrap(myArray);
buffer.order(ByteOrder.LITTLE_ENDIAN);  // if you want little-endian
int result = buffer.getShort();

另请参阅将4个字节转换为整数


1
谢谢,这个可行。ByteBuffer会处理有符号和无符号字节吗? - keshav
1
@keshav:我已经测试过了。ByteBuffer会正确处理这个问题。也就是说,当且仅当这些字节表示一个负数时,此代码将输出一个负的int。演示:这里这里。请记住,只有当最高位(最左边)为1时,它才是负数。 - Matt Ball
1
иҝҷж ·еҒҡжҳҜиЎҢдёҚйҖҡзҡ„пјҢеӣ дёә+жҜ”<<зҡ„дјҳе…Ҳзә§жӣҙй«ҳпјҢжүҖд»Ҙa << 8 + bдёҺa << (8 + b)жҳҜзӣёеҗҢзҡ„пјҢиҝҷдёҚжҳҜдҪ жғіиҰҒзҡ„гҖӮжӯӨеӨ–пјҢеңЁJavaдёӯпјҢbyteжҳҜжңүз¬ҰеҸ·зҡ„пјҢеҰӮжһңдҪҺдҪҚеӯ—иҠӮдёәиҙҹж•°пјҢе°ҶдјҡеҸ‘з”ҹзіҹзі•зҡ„дәӢжғ…гҖӮ - Chris Dodd
这个答案应该被分成两部分,因为第一部分是错误的,而 ByteBuffer 部分很好并且干净,实际上也起作用。 - user1338062
@MattBall 是的,已点赞!其实我被错误的部分咬了一口,尽管那是我自己写的 :) - user1338062
显示剩余3条评论

11
在Java中,字节是有符号的,这意味着一个字节的值可以是负数,当发生这种情况时,@MattBall的原始解决方案将无法工作。
例如,如果字节数组的二进制形式如下:
1000 1101 1000 1101
那么myArray [0]是1000 1101,myArray [1]是1000 1101,字节1000 1101的十进制值为-115而不是141(= 2 ^ 7 + 2 ^ 3 + 2 ^ 2 + 2 ^ 0)
如果我们使用
int result =(myArray [0] << 8)+ myArray [1]
值将是-16191,这是错误的。
它是错误的原因在于,当我们将2个字节的数组解释为整数时,所有字节都是无符号的,因此在翻译时,我们应该将有符号的字节映射到无符号整数:
((myArray [0]&0xff)<< 8)+(myArray [1]&0xff)
结果是36237,请使用计算器或ByteBuffer检查是否正确(我已经完成了,是正确的)。

3
只需按照以下步骤操作:
return new BigInteger(byte[] yourByteArray).intValue();

在蓝牙命令转换等方面表现良好。不必担心有符号与无符号转换。


注意:这个类中有一个构造函数,您可以手动指定您希望处理无符号值。 - brunch875

3

每个字节都是在-128..127范围内的整数,因此您需要一种将一对整数映射到单个整数的方法。有许多方法可以做到这一点,具体取决于您在一对字节中编码了什么。最常见的是将16位带符号整数存储为一对字节。将其转换回整数取决于您是否以big-endian形式存储它:

(byte_array[0]<<8) + (byte_array[1] & 0xff)

或小端:

(byte_array[1]<<8) + (byte_array[0] & 0xff)

3
此外,如果您可以使用Guava库:
Ints.fromByteArray(0, 0, myArray[1], myArray[0]);

这句话值得一提,因为很多项目都在使用它。

0
import java.io.*;
public class ByteArray {

    public static void main(String[] args) throws IOException {
        File f=new File("c:/users/sample.txt");
        byte[]b={1,2,3,4,5};
        ByteArrayInputStream is=new ByteArrayInputStream(b);
        int i;
        while((i=is.read())!=-1) {
            System.out.println((int)i); 
            FileOutputStream f1=new FileOutputStream(f);
            FileOutputStream f2=new FileOutputStream(f);
            ByteArrayOutputStream b1=new ByteArrayOutputStream();
            b1.write(6545);
            b1.writeTo(f1);
            b1.writeTo(f2);
            b1.close();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接