解码协议表格浮点到字节

时间:2015-08-17 10:53:48

标签: java

我有代码:

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
........

从4.1到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

3 个答案:

答案 0 :(得分:0)

如预期乘法后的整数,请尝试舍入数字:

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

由于缺乏精确度,乘法结果可能恰好低于整数(如31.999999f而不是32.0f)。

答案 1 :(得分: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);
}

答案 2 :(得分: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)));
    }
}