2015-08-17 1 views
1

У меня есть код: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 
+0

Вы уверены, что первая «кодировка» правильная, у вас есть только 7 бит плюс знак, но вы отбрасываете более низкие 3 бита, что означает, что у вас всего 4 бита. Каким должен быть установлен сброшенный 3 бит? –

+0

Я тестировал 'decode (encode (byte))' для всех возможных байтов со 100 LSB, он отлично работает. Выполняете ли вы какие-либо дополнительные преобразования с помощью значения 'float'? Возможно, сериализуется/десериализуется? Покажите нам полный код, если он не работает. Вероятно, это ошибка округления. –

+0

@ Питер Лоури. Я написал второй метод 'decode', первый из которых« encode »является кодом некоторой программы. Результат 'decode' неверен –

ответ

0

В первую очередь decode средства преобразования данных уровня протокола уровня приложений, а также encode средства преобразование данных приложения для транспортировки уровня (например URLEncoder). Вы называете методы противоположными. Во-вторых, нет смысла тестировать этот метод для более чем 256 байтовых значений, потому что байт имеет только 256 различных значений (вы не используете 3 бита, поэтому вы можете передавать только 2^5 = 32 разных значения поплавка). В-третьих, ваш тест должен проверить, что входящие данные приложения проходят через транспортный протокол и восстанавливаются в исходное состояние. Пожалуйста, посмотрите мой код:

public static float decode(byte val) { 
    val = (byte) (val >> 3); 
    val = (byte) (val & 0x1F); 
    return (float) (val + 10)/10.0f; 
} 
public static byte encode(float val) { 
    val *= 10.0f; 
    val -= 10; 
    int tmp = (int)val; 
    byte tmp2 = (byte) (tmp << 3); 
    return tmp2; 
} 

public static void main(String[] args) { 
    for (int i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; i++) { 
     float f = decode((byte)i); 
     System.out.printf("%s\t%s%n", f, decode(encode(f))); 
    } 
} 
0

Как вы ожидаете целое число после умножения, попробуйте закруглить свой номер:

public static byte decode(float val) { 
    val = Math.round(val * 10.0f); 
    val -= 10; 
    ... 
} 

Вероятно, появится результат умножения быть чуть ниже целого числа (например, 31.999999f вместо 32.0f) из-за отсутствие точности.

+0

Он не работает, те же неправильные значения. –

0

Попробуйте это:

float byteToFloat (byte byteVal) { 
    final byte[] bytes = { 0, 0, 0, byteVal } 
    return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getFloat(); 
} 

byte floatToByte (float floatVal) { 
    final int bits = Float.floatToIntBits(floatVal); 
    return (byte)(bits & 0xff); 
} 
Смежные вопросы