2017-12-18 174 views
1

我得到两个java字节作为输入,共同表示一个16位有符号整数。我需要将它转换为一个单一的java整数(当然,签名)。我想出了一个“丑陋的”解决方案,其中包括转换为int,然后转换为short,然后转换为int。有更短更优雅的方式吗? 我的代码如下:如何简化这种二进制到java类型的代码?

public int convert(byte b1, byte b2){ 
    int i1 = (int) (((b2 << 8) + (b1 & 0xFF)) & 0x0000FFFF); 
    short s1 = (short) i1; 
    int i2 = (int) s1; 
    return i2; 
} 
+0

'return(short)i1;'会更简单,利用自动加宽。 –

+0

但是我最终必须得到一个int(不是简短的)(出于传统的原因)。 – alebo611

+0

'return(short)i1;'与您最后3行相同。勾小指。 –

回答

1

这似乎符合您转换器 - 不能确定它是简单,但它肯定是少冗长。

public int convert2(byte b1, byte b2) { 
    return new BigInteger(new byte[]{b2,b1}).intValue(); 
} 
+0

有趣的解决方案,将尝试。我忘了提及表演并不重要。我需要实时转换这些数字的吨数。 – alebo611

1

以下是等效的:

return (short) ((b2 << 8) | (b1 & 0xFF)); 

byte具有足够小的范围内,这是实际中测试该等价为b1b2所有可能的值:

byte b1 = Byte.MIN_VALUE; 
do { 
    byte b2 = Byte.MIN_VALUE; 
    do { 
    assertEquals(convert(b1, b2), convertEquivalent(b1, b2)); 
    } while (b2++ != Byte.MAX_VALUE); 
} while (b1++ != Byte.MAX_VALUE); 

Ideone demo

0

@AndTurner可能是您寻求的解决方案。

但是,如果涉及字节数组或某个文件通道(存储器映射文件),输入流,则可以使用ByteBuffer。

byte[] bytes = ... 
ByteBuffer buf = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); 
... 
short n = buf.readShort(); // Sequential 
short m = buf.readShort(354L); // Direct access