122

多くの異なる値に対する文字列比較の代わりに 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 標準ライブラリで行う必要があります。

よろしくお願いいたします。

4

9 に答える 9

163

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

使用する

Long.parseLong("AA0F245C", 16);
于 2012-06-25T17:50:20.097 に答える
43

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

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);
于 2015-11-04T09:39:37.073 に答える
21

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

Long.parseLong("AA0F245C", 16);

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

于 2012-06-25T17:55:31.667 に答える
12

format パラメータを指定して parseInt を使用すると、簡単に実行できます。

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

javadoc 整数

于 2012-06-25T18:19:19.637 に答える
3

符号付きバイトの 16 進表現を 2 文字の文字列からバイト (Java では常に符号付き) に変換する必要がある人のために、例があります。16 進数の文字列を解析しても、負の数が返されることはありません。これは問題です。これは、0xFF はある観点 (2 の補数コーディング) からは -1 であるためです。原則は、着信文字列をバイトより大きい 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 を与える) として表される場合、Integer に適合しないためです。そのため、保存するにはロングが必要です。負の数に変換し、整数にキャストした後、収まります。最後に整数に適合しない 8 文字の 16 進文字列はありません。

于 2018-05-25T09:25:02.097 に答える
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;
}
于 2020-02-27T13:44:12.033 に答える