2013-08-06 29 views
9

Muszę przekonwertować int na wartość szesnastkową. Jest to na przykład wartość int:Android int na konwersję szesnastkową

int_value = -13516; 

Aby przeliczyć na wartość hex zrobić:

hex_value = Integer.toHexString(int_value); 

Wartość, która powinna uzyskać to: -34CC (nie wiem, czy powinienem zrobić to pozytywne).

Chodzi o to, że robi konwersję w ten sposób, że wartość pojawia się: ffff cb34

nie mogę korzystać z tej funkcji, aby uczynić tę przemianę?

+0

To nie dokonać konwersji! Dało ci szesnastkową reprezentację wartości, która ma ustawiony bit znaku, ponieważ jest ujemny. Android używa uzupełnienia dwójkowego do reprezentowania ujemnych liczb całkowitych: wartość ujemna jest reprezentowana przez ustawiony lewy skrajny bit, a wartość dodatnia jest reprezentowana przez lewy skrajny bit, który jest rozbrajany. Zobacz [Podpisane reprezentacje liczbowe] (https://en.wikipedia.org/wiki/Signed_number_representations). Zdaję sobie sprawę, że ma to dwa lata, ale solidne zrozumienie podstawowych mechanizmów jest cenną rzeczą dla programistów. :) –

+0

@LorneLaliberte Nadal nieoczekiwane, jeśli (na przykład) masz tło C, gdzie specyfikator formatu% X printf da ci niepodpisaną szesnastkową reprezentację niezależnie od tego, ile go podasz, podpisałeś czy nie. Co gorsza, Java nie ma * * niepodpisanych typów całkowitych, więc nie możesz nawet tego naprawić! – Michael

+0

@Micheal nie ma różnicy między C i Java w tym przypadku, w rzeczywistości java zwraca również wartość unsigned.Bity (a zatem szesnastkowa reprezentacja tych bitów) są takie same w obu kierunkach. "Podpisany" i "niepodpisany" to tylko różne interpretacje bitów. Myślę, że możesz odświeżyć swoją pamięć funkcji 'sprintf' w C, ponieważ specyfikator'% X' działa w taki sam sposób w obu językach. –

Odpowiedz

18

Dokumentacja mówi Integer.toHexString powraca szesnastkowy reprezentację int jako wartość bez znaku.

Wierzę, że Integer.toString(value, 16) osiągnie to, co chcesz.

+0

Na razie próbowałem i wydaje mi się, że to właściwa droga! – masmic

1

Go poprzez następujący kod dla Integer Hex Hex do liczby całkowitej konwersji

public class MainActivity extends Activity { 

int number; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    number = 678668; 
    Log.i("ACT", "Integer Number " + number); 

    /** 
    * Code for convert integer number to hex number. two mwthods. 
    */ 
    Log.i("ACT", String.format("#%x", number)); // use lower case x for 
               // lowercase hex 
    Log.i("ACT", "#" + Integer.toHexString(number)); 

    /** 
    * Code for convert hex number to integer number 
    */ 
    String hex = Integer.toHexString(number).replace("/^#/", ""); 
    int intValue = Integer.parseInt(hex, 16); 

    Log.i("ACT", "Integer Number " + intValue); 
    } 

} 
3
public static int convert(int n) { 
    return Integer.valueOf(String.valueOf(n), 16); 
} 
// in onstart: 
Log.v("TAG", convert(20) + ""); // 32 
Log.v("TAG", convert(54) + ""); // 84 

Od: Java Convert integer to hex integer

+0

Ale robiąc to, czy nie robisz konwersji z hex do int? Muszę zrobić to inaczej, od podpisanej int, na heks. – masmic

+0

Masz rację, jest odwrotnie. – VM4

2

Zarówno Integer.toHexString, jak również string.Format ("% x") nie obsługują znaki. Aby rozwiązać ten problem, można użyć potrójny wyrażenie:

int int_value = -13516; 
    String hex_value = int_value < 0 
         ? "-" + Integer.toHexString(-int_value) 
         : Integer.toHexString(int_value); 
1

Nie sądzę powyższe odpowiedzi nie daje dokładną wartość dla podpisanych bitów. Na przykład wartość 11 jest 0B ale wartość -11 byłoby F5 i nie -B od 2 Uzupełnienie dostaje się do gry, aby rozwiązać ten problem i zostały zmodyfikowane powyższą odpowiedź

int int_value = -11; 
String hex_value = int_value < 0 
          ? Integer.toHexString(int_value+65536) : Integer.toHexString(int_value); 
String shortHexString = hex_value.substring(2); 

gdzie 65536 to 2^16 teraz możesz uzyskać oczekiwane rezultaty. Szczęśliwy kodowania :)

  • przedmiot
0
String.format("#%06X", (0xFFFFFF & colorYellow)); 

wyjściowa: #FFC107