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


111

8桁の16進コードの文字列を整数に変換して、さまざまな値の文字列比較ではなくint比較を実行できるようにしています。

これは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標準ライブラリで行う必要があります。

よろしくお願いします。


あなたがシフトしなければならないときにあなたは増殖しています。
Nathan Moinvaziri

7
0xAA0F245C = 2853119068しかしInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

5
質問が2年間続いていることを知っています。ただし、Java 8は別のソリューションを可能にします。彼らInteger.parseUnsignedInt("value",radix)はあなたの目的にかなう方法を追加しました。値がそれより大きい場合Integer.MAX_VALUE、負の数にマップされます。
ジョン

回答:


151

これは単にint(4バイトで符号付き)には大きすぎます。

使用する

Long.parseLong("AA0F245C", 16);

4
素晴らしいありがとう!私はおそらくそれを知っていたはずです。しかし、投稿前に尋ねた4人の誰もそれを知らなかったので気分がよくなった:) 余談ですが、intを比較するために必要なコードを書いた人がlongではなくintとしてコードを作成した理由を理解する必要があります。それはポイントの外です...迅速な回答をありがとう!!!! また、あなたのひどいエラーメッセージのためにjavaを呪ってください...「それは大きすぎる」は役に立ちました。
Roloc

大きな16進文字列で試してみると、NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"...解決策はありますか?
Anum Sheraz

@AnumSheraz longに変換したくないが、バイト配列に変換したい。たとえば、stackoverflow.com
questions / 140131 /…を

多数のバイト配列に変換する代わりに使用することであるBigInteger。このようなクラスBigInteger value = new BigInteger(valueString, 16)
Javaru

33

あなたはそのように使うかもしれません

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

1
私はこの答えが好きですが、Integerクラスにこのための型に依存しない汎用メソッドがあることを知りませんでした。知識をありがとう。
Gewure

18

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

Long.parseLong("AA0F245C", 16);

それを動作させるために。


オフ:興味深いことに、5分後ではあるものの、14に比べてより詳細な回答は1票しか得られません。本当ですが、これは不思議な「4バイト」と「署名」とは言いませんでした。
n611x007 2013年

9

parseIntとformatパラメーターを使用すると、簡単に行うことができます。

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

javadoc整数


リンクが壊れています
odinthenerd '


3

符号付きバイトの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が正の数として表される場合、整数に適合しないためです(4294967295を与える)。したがって、それを保管するにはLongが必要です。負の数に変換してIntegerにキャストバックすると、収まります。最後に整数に適合しない8文字の16進数文字列はありません。


1

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

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266

0
//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

これで試してください:

long abc = convertString2Hex( "1A2A3B");

private  long  convertString2Hex(String numberHexString)
{
    char[] ChaArray = numberHexString.toCharArray();
    long HexSum=0;
    long cChar =0;

    for(int i=0;i<numberHexString.length();i++ )
    {
        if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
            cChar = ChaArray[i] - '0';
        else
            cChar = ChaArray[i]-'A'+10;
        HexSum = 16 * HexSum + cChar;
    }
    return  HexSum;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.