web-dev-qa-db-ja.com

16進文字列をintに変換します

多くの異なる値で文字列比較の代わりにint比較を行えるように、8文字の16進コードの文字列を整数に変換しようとしています。

これはC++ではかなり簡単なことですが、Javaで行う必要があります。満たす必要があるテストケースは、基本的に「AA0F245C」をintに変換し、その文字列に戻すことです。これにより、正しく変換されていることがわかります。

私は次を試しました:

int decode = Integer.decode("0xAA0F245C");  // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException

また、一度に2文字ずつ実行し、結果を乗算してみました。変換は機能しますが、数値は正しくありません。

int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
    String sub = hex.subSequence(h, h+2).toString();

if (id == 0)
    id = Integer.valueOf(sub, 16);
else
    id *= Integer.valueOf(sub, 16);             
 }
//ID = 8445600 which = 80DEA0 if I convert it back. 

あなたが知っているようにサードパーティのライブラリを使用することはできないので、これはJava標準ライブラリで行わなければなりません。

よろしくお願いします。

98
Roloc

Int(4バイトで符号付き)には大きすぎます。

つかいます

Long.parseLong("AA0F245C", 16);
137
Denys Séguret

あなたはそのように使うことができます

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);
27
manikant gautam

Java Integerが処理できる最大値は2147483657または2 ^ 31-1です。 16進数AA0F245Cは10進数として2853119068であり、大きすぎるため、使用する必要があります

Long.parseLong("AA0F245C", 16);

それを機能させるために。

16
Incompl

formatパラメーターを指定したparseIntで簡単に実行できます。

Integer.parseInt("-FF", 16) ; // returns -255

javadoc整数

6
heat

これは正しい答えです:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)

署名付きバイトの16進表現を2文字の文字列からバイト(Javaでは常に署名される)に変換する必要がある場合は、例があります。 16進数の文字列を解析しても負の数が得られることはありません。これは、0xFFが何らかの観点から-1であるため(2の補数コーディング)、誤りです。原則は、着信文字列をバイトよりも大きいintとして解析し、負の数をラップすることです。バイトのみを表示しているので、その例は十分に短いです。

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

これを編集して、より長い数字を処理できます。それぞれFFまたは00を追加するだけです。 8個の16進文字の符号付き整数を解析するには、Long.parseLongを使用する必要があります。これは、整数-1であるFFFF-FFFFが正の数として表されるとIntegerに収まらないためです(4294967295になります)。そのため、保存するにはLongが必要です。負の数に変換して整数にキャストすると、収まります。 8文字の16進文字列はありません。これは、最後に整数に適合しません。

2
JanSmrz

提案されたものの追加オプションは、BigIntegerクラスを使用することです。 16進値は多くの場合、sha256やsha512などの大きな数値であるため、intおよびlongから簡単にオーバーフローします。他の回答が示すように、バイト配列への変換はオプションですが、Javaでしばしば忘れられているBigIntergerもオプションです。

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266
0
Javaru
//Method for Smaller Number Range:
Integer.parseInt("abc",16);

//Method for Bigger Number Range.
Long.parseLong("abc",16);

//Method for Biggest Number Range.
new BigInteger("abc",16);
0
Nitish Kumar