用于负数的Android 8位到16位表示

时间:2016-06-30 08:52:53

标签: java android android-layout

请参阅问题tf permission。 我得到了这样的答案

short yourinteger16 = (short)(((-39 & 0xFF) << 8) | (-16 & 0xFF));

这个答案对于正数是正确的。但在负数的情况下,它失败了。

例如,我将来自BLE的值作为-10发送到应用程序。由于电流和电压的mAh / mV转换,该值将从BLE转换为-10000。这些值被分成两个字节,我在我的应用程序中得到字节值为-39和-16。我将字节传递给方法,如下所示。

Integer ampValue = null;
        if (mBleDataHashMap.containsKey(SuperMuttBleConst.RESP_I_HIGH) &&
                mBleDataHashMap.containsKey(SuperMuttBleConst.RESP_I_LOW)) {
            ampValue = get8ByteTo16Byte(mBleDataHashMap.get(SuperMuttBleConst.RESP_I_HIGH),
                    mBleDataHashMap.get(SuperMuttBleConst.RESP_I_LOW));

        }
        if (ampValue != null) {
            float newAmp = ampValue.floatValue();
            newAmp = newAmp/1000;
            mAmpTextvw.setText("" + newAmp);
        }

但是我得到的结果为9.77,作为你的整数16的浮动值。

有人对此有任何想法吗?任何解决方案请更新我。

完整代码:

 protected Integer get8ByteTo16Byte(int firstValue, int secondValue) {
        Short integerValue =  (short)((((byte) firstValue & 0xFF) << 8) | ((byte) secondValue & 0xFF));
        return new Integer(integerValue);
    }

方法

{{1}}

1 个答案:

答案 0 :(得分:2)

您完全接收-39和-16 (分别为-10000的高字节和低字节)。

使用addition代替OR高字节和低字节。 请尝试以下

    short result = (short) (((short)(-39 & (byte)0xFF) << 8) + (short)(-16 & (byte)0xFF));

当处理2的补码运算时,负的低字节会导致高字节出现问题。