如何简化这种二进制到java类型的代码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何简化这种二进制到java类型的代码?相关的知识,希望对你有一定的参考价值。

我得到两个java字节作为输入,它们一起表示一个16位有符号整数。我需要将它转换为一个单独的java整数(当然是签名)。我想出了一个“丑陋”的解决方案,包括转换为int,然后转换为short,然后转换为int。有更短更优雅的方式吗?我的代码如下:

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

这似乎与您的转换器相匹配 - 不确定它是否更简单,但它肯定不那么冗长。

public int convert2(byte b1, byte b2) {
    return new BigInteger(new byte[]{b2,b1}).intValue();
}
另一答案

以下是等效的:

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

另一答案

@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

以上是关于如何简化这种二进制到java类型的代码?的主要内容,如果未能解决你的问题,请参考以下文章

在 GraphQL 中重用输入类型作为片段 [重复]

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

如何在 C 中简化这个工作的二进制搜索代码?

如何在片段中使用 GetJsonFromUrlTask​​.java

(转) Java中的负数及基本类型的转型详解

为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args