2015-12-17 2 views
4

Я хочу разобрать температуру из байт.Как очистить самый старший бит в байте?

Температура составляет 2 байта. Самый старший бит первого байта указывает, является ли температура положительной или отрицательной.

Это то, что я до сих пор:

public double parseTemperatureBytes(byte[] temperatureBytes) { 
    // Must be divided by 10 (1 decimal) 
    // First bit indicates sign (bit 1 = negative, bit 0 = positive) 
    // Range [0x7FFF] : [-3276.7 … +3276.7] 

    byte firstByte = temperatureBytes[0]; 
    int positiveOrNegative = ParseUtils.getMostSignificantBit(firstByte); 
    boolean isPositive = positiveOrNegative == 0; 

    String temperatureHex = ParseUtils.bytesToHex(temperatureBytes); 
    int temperatureHexToInteger = Integer.parseInt(temperatureHex, 16); 
    double temperature = temperatureHexToInteger/(double) 10; 

    if (!isPositive) { 
     temperature = -temperature; 
    } 

    return temperature; 
} 


// ParseUtils 

public static int getMostSignificantBit(byte b) { 
    return (b & 0xff) >> 7; 
} 

Это работает, но я все равно должны убедиться, что я игнорирую значащий бит первого байта. Это всего лишь флаг, а не часть температуры.

Ex: Если я прохожу в 0xFFFF он возвращает -6553,5, но это должно быть -3276,7

Как я могу добиться этого?

+1

Как действительно ли это значение отличается от обычного «большого конца»? – EJP

ответ

2

Вы можете проверить, является ли данная температура минус, используя следующий код ..

public static int getMostSignificantBit(byte b) { 
    return b & 0x80; 
} 

Вы можете использовать следующий код, чтобы получить значение температуры ..

public static double parseTemperatureBytes(byte[] temperatureBytes) { 
    int firstByte = temperatureBytes[0] & 0x7F; 
    int secondByte = temperatureBytes[1] & 0xFF; 
    double temperature = ((firstByte << 8) | secondByte)/10.0; 

    if (getMostSignificantBit(temperatureBytes[0]) > 0) { 
     temperature = -temperature; 
    } 

    return temperature; 
} 
+0

Спасибо, он работает и выглядит лучше, чем мое решение. –

1

шестнадцатеричное значение F эквивалентно двоичное значение 1111. 0111 1 + 2 + 4 = 7, так 0x7F становится 01111111.

return b & 0x7f; 
0

Вычесть от величины MSB. Если этот бит установлен, ваш номер будет не менее 32768. Поэтому вычтите эту сумму.

если (num> 3276.8) num = num - 3276.8;

1

Вы можете сбросить самый старший бит с помощью маски 0x7f, затем построить 2-байтовое значение, используя двоичный сдвиг и побитовое или.

int high = temperatureBytes[0] & 0x7f; 
int low = temperatureBytes[1]; 
int value = (high << 8) | low; 
double temperature = value/10.0;