2015-01-15 3 views
0

Как преобразовать десятичное значение (температура) в 16 бит шестнадцатеричного в java?Как преобразовать десятичное значение в шестнадцатеричное в java?

вход: -54,9

Ожидаемый результат: 0x8225

У меня обратный код для него, где я уверен, преобразование 16 байт шестнадцатеричные в десятичное значение (температура).

private static double hexDataToTemperature(String tempHexData) { 

    String tempMSBstr = tempHexData.substring(0, 2); 
    String tempLSBstr = tempHexData.substring(2, 4); 

    int tempMSB = Integer.parseInt(tempMSBstr, 16); 
    int tempLSB = Integer.parseInt(tempLSBstr, 16); 
    int sign = 1; 

    if (tempMSB >= 128) { 
     tempMSB = tempMSB - 128; 
     sign = -1; 
    } 

    Float f = (float) (sign * ((float) ((tempMSB * 256) + tempLSB)/10)); 

    return Double.parseDouble("" + f); 

} 
+0

http://stackoverflow.com/questions/13465098/decimal-to-hexadecimal-converter-in-java – Stultuske

+0

16 байт - 16 бит? – laune

+0

сначала хорошая идея, поиск в базе данных stackoverflow – HCarrasko

ответ

0

Представлять температуры в десятых долей градуса как знаковое короткое значение (16 бит), представленном в шестнадцатеричном:

static String toHex(float t){ 
    short it = (short)Math.round(t*10); 
    return String.format("%04x", it); 
} 

Вы можете добавить «0x» в строку формата, если хотите. - Обратное преобразование:

static float toDec(String s){ 
    int it = Integer.parseInt(s, 16); 
    if(it > 32767) it -= 65536; 
    return it/10.0F; 
} 

Это представляет собой целое число в дополнительном коде, так что результат для -54.9 будет не быть 0x8225, но 0xfddb. Использование наиболее значимого бита в качестве знакового бита и представление абсолютного значения в оставшихся 15 бит («знаковая величина») очень необычно, особенно с Java.

Если вы хотите использовать подписанную величину:

static String toHex(float t){ 
    int sign = 0; 
    if(t < 0){ 
     sign = 0x8000; 
     t = -t; 
    } 
    short it = (short)(Math.round(t*10) + sign); 
    return String.format("%04x", it); 
} 

static float toDec(String s){ 
    int it = Integer.parseInt(s, 16); 
    if(it > 32767){ 
     it = -(it - 0x8000); 
    } 
    return it/10.0F; 
} 
+0

@launa: он не работает для меня. Пропускаю вход f: -54.9 но Ожидаемый результат: 0x8225 –

+0

, но я получаю fbbd как результат. –

+0

, что является неправильным :( –

-1

попробовать Идею из этого кода «пожалуйста, обратите внимание toHexString()»

import java.util.Scanner; 
    class DecimalToHex 
    { 
     public static void main(String args[]) 
     { 
      Scanner input = new Scanner(System.in); 
      System.out.print(" decimal number : "); 
      int num =input.nextInt(); 

      // calling method toHexString() 
      String str = Integer.toHexString(num); 
      System.out.println("Decimal to hexadecimal: "+str); 
     } 
    } 
+0

, но где я должен передать значение, которое мне нужно преобразовать? –

+0

и вход поплавок или двойной – laune

+0

с помощью сканера консоль запросит у ввести значение , тогда вы можете указать, какой тип будет занимать, если он затем равен double num = input.nextDouble(); [см. Ссылку] (http://www.java-made-easy.com/java-scanner.html). – JBALI

Смежные вопросы