16 진수 문자열을 정수로 변환


111

나는 많은 다른 값에 대한 문자열 비교 대신 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 표준 라이브러리에서 수행해야합니다.

미리 도와 주셔서 감사합니다.


당신은 변화해야 할 때 번식하고 있습니다.
Nathan Moinvaziri

7
0xAA0F245C = 2853119068하지만Integer.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

5
나는 그 질문이 2 년 동안 존재했다는 것을 알고있다. 그러나 Java 8은 다른 솔루션을 가능하게합니다. 그들은 Integer.parseUnsignedInt("value",radix)당신의 목적 에 맞는 방법을 추가했습니다 . 값이 Integer.MAX_VALUE음수 보다 크면 음수로 매핑됩니다.
John

답변:


151

int (4 바이트이고 서명 됨)에 비해 너무 큽니다.

사용하다

Long.parseLong("AA0F245C", 16);

4
좋아 고마워! 나는 아마 그것을 알았어 야했다. 그러나 그것은 내가 게시하기 전에 요청한 4 명 중 누구도 그것을 알지 못했습니다. :). 부수적으로, 나는 이제 그 사람이 int를 비교하는 데 필요한 코드를 작성한 이유를 알아 내야합니다. 그게 요점 말고 ... 빠른 답변 감사합니다 !!!! 또한 끔찍한 오류 메시지에 대해 Java를 저주하십시오. "그것은 큰 것"이 도움이되었을 것입니다.
Roloc

큰 16 진수 문자열로 시도하면 NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... 해결 방법?
Anum Sheraz

@AnumSheraz는 long으로 변환하지 않고 바이트 배열로 변환하고 싶습니다. 예를 들어 stackoverflow.com/questions/140131/…
Denys Séguret

많은 수의 바이트 배열로 변환하는 대안은 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 2016

18

Java Integer가 처리 할 수 있는 최대 값 은 2147483657 또는 2 ^ 31-1입니다. 16 진수 AA0F245C는 10 진수로 2853119068이고 너무 커서 다음을 사용해야합니다.

Long.parseLong("AA0F245C", 16);

작동합니다.


off : 5 분 후에 더 자세한 답변이 14 개에 비해 1 개의 upvote를 얻는다는 것이 흥미 롭습니다. 사실이지만 이것은 마법의 '4 bytes'와 'signed'를 말하지 않았습니다 ... hm.
n611x007 2013 년

9

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

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

javadoc 정수


링크가 끊어졌습니다
odinthenerd

5

이것이 정답입니다.

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


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 값과 같이 큰 숫자이기 때문에 쉽게 an int및 a 오버플 로 long됩니다. 다른 답변에서 알 수 있듯이 바이트 배열로 변환하는 것은 옵션이지만 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.