У меня есть код:Decode форма протокола поплавок байт
public float encode(byte val) {
val = (byte) (val >> 3);
val = (byte) (val & 0x1F);
return (float) (val + 10)/10.0f;
}
Я хочу отворот его, я знаю, что первые (LSB) бит составляет 100, я попытался код ниже, это не будет работать, пожалуйста, Помогите.
public byte decode(float val) {
val *= 10.0f;
val -= 10;
int tmp = (int)val;
byte tmp2 = (byte) (tmp << 3);
tmp2= (byte) (tmp2 | 4);
return tmp2;
//4=100
}
Они, как я проверил методы:
for(int i=0;i<1000;i++){
protocol.encode(((float)i)/10);
System.out.println((((float)i)/10) +", "+protocol.decode());
}
Результаты является:
0.0, 3.2
0.1, 3.3
0.2, 3.4
0.3, 3.5
0.4, 3.6
0.5, 3.7
0.6, 3.8
0.7, 3.9
0.8, 4.0
0.9, 4.1
1.0, 1.0
........
От 1,0 до 4,1 я получить правильные значения, после 4.1 неправильных значений.
4.1, 4.1
4.2, 1.0
4.3, 1.1
4.4, 1.2
4.5, 1.3
4.6, 1.4
Вы уверены, что первая «кодировка» правильная, у вас есть только 7 бит плюс знак, но вы отбрасываете более низкие 3 бита, что означает, что у вас всего 4 бита. Каким должен быть установлен сброшенный 3 бит? –
Я тестировал 'decode (encode (byte))' для всех возможных байтов со 100 LSB, он отлично работает. Выполняете ли вы какие-либо дополнительные преобразования с помощью значения 'float'? Возможно, сериализуется/десериализуется? Покажите нам полный код, если он не работает. Вероятно, это ошибка округления. –
@ Питер Лоури. Я написал второй метод 'decode', первый из которых« encode »является кодом некоторой программы. Результат 'decode' неверен –