0

バイナリファイルの仕様に式があります。仕様には、見出しのさまざまなバイトの意味の詳細が記載されています。
特に、1つの式はこれを約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などの値を取得して2バイトに変換する必要があります。私を最も困惑させる部分は、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

1つの問題は、にキャストしていることですshort。4.3のような値は整数ではないため、これは正しくありません。おそらくBigDecimalに変換し直したいと思うでしょう:

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

もう1つの問題は、900を2回追加しているように見えることです。1回はコンピューティング時にshortVal、もう1回はrollBytes[1] = (byte) (rollBytes[1] + 900);

于 2012-10-04T16:16:30.317 に答える