多くの異なる値で文字列比較の代わりに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標準ライブラリで行わなければなりません。
よろしくお願いします。
Int(4バイトで符号付き)には大きすぎます。
つかいます
Long.parseLong("AA0F245C", 16);
あなたはそのように使うことができます
System.out.println(Integer.decode("0x4d2")) // output 1234
//and vice versa
System.out.println(Integer.toHexString(1234); // output is 4d2);
Java Integer
が処理できる最大値は2147483657または2 ^ 31-1です。 16進数AA0F245Cは10進数として2853119068であり、大きすぎるため、使用する必要があります
Long.parseLong("AA0F245C", 16);
それを機能させるために。
これは正しい答えです:
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進文字列はありません。これは、最後に整数に適合しません。
提案されたものの追加オプションは、BigInteger
クラスを使用することです。 16進値は多くの場合、sha256やsha512などの大きな数値であるため、int
およびlong
から簡単にオーバーフローします。他の回答が示すように、バイト配列への変換はオプションですが、Javaでしばしば忘れられているBigInterger
もオプションです。
String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266
//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);