0

我在二进制文件的规范中有一个公式。该规范详细说明了标题中各个字节的含义。
特别是,一个公式说明了大约 2 个字节:

Byte 1  -->  7  6  5  4  3  2  1  0  
Byte 2  -->  7  6  5  4  3  2  1  0 

R  Roll 
 If 'R' = 0, Roll Angle not available 
 If 'R' = 1, Roll Angle = [((Byte 84 & 0x7F)<<8) | (Byte 85) – 900] / 10 

我需要取一个值,例如 4.3 并将其转换为两个字节,以便能够使用上述公式将其转换回 4.3。最让我困惑的部分是减去 900。

这是我到目前为止所拥有的:

private byte[] getRollBytes(BigDecimal[] positionData) {

    BigDecimal roll = positionData[4];
    roll = roll.multiply(BigDecimal.TEN);
    roll = roll.add(new BigDecimal(900));
    short shortval = roll.shortValue();

    byte[] rollBytes = new byte[2];

    ByteBuffer headingbuf = ByteBuffer.wrap(rollBytes);
    headingbuf.order(ByteOrder.BIG_ENDIAN);
    headingbuf.putShort(shortval);

    //set the leftmost bit of the two bytes to 'on', meaning data is available
    rollBytes[0] = (byte) (rollBytes[0] | (0x80));

    //testing the result with my formula doesn't give me the right answer:
    float testFloat = (float) (((((rollBytes[0] & 0x7F) <<8) | rollBytes[1]) - 900) /10);           

    return rollBytes;
}

我认为在短字节和字节之间的转换中丢失了一些东西......

4

1 回答 1

0

一个问题是您正在转换为short. 这不可能是正确的,因为像 4.3 这样的值不是整数。您可能想要转换回 BigDecimal:

BigDecimal testVal = ((rollBytes[0] & 0x7F) <<8) | rollBytes[1]) - 900;
testVal = val.divide(BigDecimal.valueOf(10));

另一个问题是您似乎将 900 添加了两次——一次是在计算时,另shortVal一次是rollBytes[1] = (byte) (rollBytes[1] + 900);

于 2012-10-04T16:16:30.317 回答