在Java中从字节解码实数

在Java中从字节解码实数,java,bytebuffer,Java,Bytebuffer,我有一个传感器,可以与Android应用程序通信。应用程序将从传感器接收的字节收集到字节缓冲区中。各种传感器读数之一的文档说明该值是一个占用4字节的实数变量,因此对于该值,我在缓冲区中执行getFloat()。然而,我得到的值太小,不可能是正确的,但是它们与其他正确的测量值有很好的相关性。我已经检查了字节顺序,它是正确的。请注意,其他值的记录更为具体,例如32位无符号整数。在Java中,有没有其他方法可以将4个字节解码为实际值 代码: ByteBuffer packetBufferLittleE

我有一个传感器,可以与Android应用程序通信。应用程序将从传感器接收的字节收集到字节缓冲区中。各种传感器读数之一的文档说明该值是一个占用4字节的实数变量,因此对于该值,我在缓冲区中执行getFloat()。然而,我得到的值太小,不可能是正确的,但是它们与其他正确的测量值有很好的相关性。我已经检查了字节顺序,它是正确的。请注意,其他值的记录更为具体,例如32位无符号整数。在Java中,有没有其他方法可以将4个字节解码为实际值

代码:

ByteBuffer packetBufferLittleEnd = ByteBuffer.wrap(finalPacket).order(ByteOrder.LITTLE_ENDIAN);

measurement = packetBufferLittleEnd.getFloat();
更新: 我浏览了S.O.并找到了另一篇可能会给你答案的帖子。检查此链接:


如果试图用2的补码表示有符号整数,则所有正数都表示为其无符号版本
但是,要在2的补码中获得负值,必须遵循以下步骤:

  • 反转数字的所有位
  • 将二进制1添加到倒数
  • 下面的示例演示了这一点

    1为无符号32位: 0000 0000 0000 0001

    1/2的补码: 0000 0000 0000 0001

    -1在2的补语中:

    • 反转无符号表示的所有位:1111111111111111111111111111111111111111111111111110
    • 添加二进制1:1111111111111111111111111111111111111(这是2的补码中的-1)

    对于浮点数,这个过程要花费更多的时间。您必须使用IEEE 754标准转换过程来转换数字的以10为基数的表示形式和以2为基数的表示形式。这就是您将有符号数字从二进制转换为以10为基数的表示形式所需的内容。

    您能发布一些示例数据吗?您是否在
    ByteBuffer上尝试过不同的字节顺序设置?
    文档中是否有更多详细信息?例如,他们提到IEEE754吗?如果是4字节(32位),为什么不把二进制转换成10进制呢?计算机使用2的补码,这在网络上有很好的记录。正如@WhiteHotLoveTiger所建议的,我将查找IEEE 754标准中的浮点数及其与基数10之间的转换。另外,您需要知道您使用的是big-endian还是little-endian。它是浮点还是定点?确切地说,实数是非常通用的,这就是为什么我感到困惑。我提到我尝试了不同的字节顺序(字节顺序是正确的),对于其他读数,他们提到了更具体的格式,例如32位无符号整数。我的读数虽然很小,但与其他传感器站的金标准读数(0.81)有很好的相关性。@EJP是的,我知道实数的定义。为了利用IEEE 754转换实数,您仍然必须知道2的补码。我认为否决这个答案是不公平的;它为OP的问题和他/她可能面临的其他情况(整数和浮点数)提供了解决方案。我要求提供一种更具体的Java方法来转换值。我已尝试从字节缓冲区中使用两种类型的字节顺序获取getFloat(),但它不起作用。@KociKocev我刚刚用您可能要查找的内容更新了我的答案,请查看我答案顶部的链接。这正是我正在做的,但它不起作用,正如我所提到的。@KociKocev当你没有发布任何代码时,很难知道你在做什么:P