我在二进制文件的规范中有一个公式。规范详细说明了标题中各种字节的含义 特别是,一个公式说明了大约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;
}
我认为在短和字节之间的转换中有些东西会丢失......
答案 0 :(得分:0)
一个问题是你要投射到short
。这可能不正确,因为像4.3这样的值不是整数。您可能想要转换回BigDecimal:
BigDecimal testVal = ((rollBytes[0] & 0x7F) <<8) | rollBytes[1]) - 900;
testVal = val.divide(BigDecimal.valueOf(10));
另一个问题是,您似乎在计算shortVal
时再次添加900次,并再次使用rollBytes[1] = (byte) (rollBytes[1] + 900);