[java] 16 진수 문자열을 정수로 변환

나는 많은 다른 값에 대한 문자열 비교 대신 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

나는 또한 한 번에 두 문자를 수행하고 결과를 곱해 보았는데 변환이 작동하지만 숫자가 올바르지 않습니다.

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);

작동합니다.


답변

format 매개 변수를 사용하여 parseInt로 쉽게 수행 할 수 있습니다.

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

javadoc 정수


답변

이것이 정답입니다.

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는 양수로 표시 될 때 정수에 맞지 않기 때문입니다 (4294967295 제공). 따라서 저장하려면 Long이 필요합니다. 음수로 변환하고 Integer로 다시 캐스팅하면 적합합니다. 끝에 정수에 맞지 않는 8 자 16 진 문자열이 없습니다.


답변

제안 된 옵션에 대한 추가 옵션은 BigInteger수업 을 사용하는 것 입니다. 16 진수 값은 종종 sha256 또는 sha512 값과 같이 큰 숫자이기 때문에 쉽게 an int및 a 오버플 로 long됩니다. 다른 답변에서 알 수 있듯이 바이트 배열로 변환하는 것은 옵션이지만 BigIntergerJava에서 자주 잊혀진 클래스도 옵션입니다.

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