2012-02-12 11 views
19

znalazłem następujący sposób hex do konwersji binarnej:przekonwertować ciąg szesnastkowy (hex) na ciąg binarny

String binAddr = Integer.toBinaryString(Integer.parseInt(hexAddr, 16)); 

Choć takie podejście działa dla małych liczb HEX, numer szesnastkowy takie jak następujące

A14AA1DBDB818F9759 

rzuca NumberFormatException.

I dlatego napisał następujący sposób, który wydaje się działać:

private String hexToBin(String hex){ 
    String bin = ""; 
    String binFragment = ""; 
    int iHex; 
    hex = hex.trim(); 
    hex = hex.replaceFirst("0x", ""); 

    for(int i = 0; i < hex.length(); i++){ 
     iHex = Integer.parseInt(""+hex.charAt(i),16); 
     binFragment = Integer.toBinaryString(iHex); 

     while(binFragment.length() < 4){ 
      binFragment = "0" + binFragment; 
     } 
     bin += binFragment; 
    } 
    return bin; 
} 

Powyższa metoda w zasadzie przyjmuje każdy znak w ciągu szesnastkowym i konwertuje go na jego binarne równoważne pola z zerami, jeśli to konieczne, a następnie dołącza je do wartości zwracanej. Czy jest to właściwy sposób przeprowadzenia konwersji? Czy mogę przeoczyć coś, co może spowodować, że moje podejście się nie powiedzie?

Z góry dziękujemy za wszelką pomoc.

+0

Czy długo nie działają za to, co chcesz? Ma również ToBinaryString(). To by wsparło ... Zakresy od -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807. – Jared

+0

jeśli to, co chcesz, daj mi znać, więc mogę wysłać jako odpowiedź proszę. – Jared

+0

Twój kod wygląda dobrze. Możesz również spojrzeć na następujący link: http://java2everyone.blogspot.in/2009/04/java-hexadecimal-to-binary.html?m=1 –

Odpowiedz

34

BigInteger.toString(radix) zrobi to, co chcesz. Prostu przejść w przelicznika 2.

static String hexToBin(String s) { 
    return new BigInteger(s, 16).toString(2); 
} 
+0

Rzeczywiście. Jedynym problemem jest to, że liczby rosną zbyt duże, aby zmieścić się w "int". –

+0

Właśnie, przepraszam. Przepełnienie to problem z kodem OP, a to rozwiązanie naprawia. –

+0

@LouisWasserman, rozumie. Całkiem dobrze. –

4
Integer.parseInt(hex,16);  
System.out.print(Integer.toBinaryString(hex)); 

składni hex (string), aby całkowite z podstawy 16, a następnie przekształcić go w ciąg binarny, stosując metodę toBinaryString (int)

przykład

int num = (Integer.parseInt("A2B", 16)); 
System.out.print(Integer.toBinaryString(num)); 

Wydruk:

101000101011 

Max Hex vakue obsługiwane przez int to fffffff

czyli jeśli FFFFFFF0 przepuszcza ti da error

2

Z wszystkich zer:

static String hexToBin(String s) { 
    String preBin = new BigInteger(s, 16).toString(2); 
    Integer length = preBin.length(); 
    if (length < 8) { 
     for (int i = 0; i < 8 - length; i++) { 
      preBin = "0" + preBin; 
     } 
    } 
    return preBin; 
} 
1
public static byte[] hexToBin(String str) 
    { 
     int len = str.length(); 
     byte[] out = new byte[len/2]; 
     int endIndx; 

     for (int i = 0; i < len; i = i + 2) 
     { 
      endIndx = i + 2; 
      if (endIndx > len) 
       endIndx = len - 1; 
      out[i/2] = (byte) Integer.parseInt(str.substring(i, endIndx), 16); 
     } 
     return out; 
    } 
0
import java.util.*; 
public class HexadeciamlToBinary 
{ 
    public static void main() 
    { 
     Scanner sc=new Scanner(System.in); 
     System.out.println("enter the hexadecimal number"); 
     String s=sc.nextLine(); 
     String p=""; 
     long n=0; 
     int c=0; 
     for(int i=s.length()-1;i>=0;i--) 
     { 
      if(s.charAt(i)=='A') 
      { 
      n=n+(long)(Math.pow(16,c)*10); 
      c++; 
      } 
     else if(s.charAt(i)=='B') 
     { 
      n=n+(long)(Math.pow(16,c)*11); 
      c++; 
     } 
     else if(s.charAt(i)=='C') 
     { 
      n=n+(long)(Math.pow(16,c)*12); 
      c++; 
     } 
     else if(s.charAt(i)=='D') 
     { 
      n=n+(long)(Math.pow(16,c)*13); 
      c++; 
     } 
     else if(s.charAt(i)=='E') 
     { 
      n=n+(long)(Math.pow(16,c)*14); 
      c++; 
     } 
     else if(s.charAt(i)=='F') 
     { 
      n=n+(long)(Math.pow(16,c)*15); 
      c++; 
     } 
     else 
     { 
      n=n+(long)Math.pow(16,c)*(long)s.charAt(i); 
      c++; 
     } 
    } 
    String s1="",k=""; 
    if(n>1) 
    { 
    while(n>0) 
    { 
     if(n%2==0) 
     { 
      k=k+"0"; 
      n=n/2; 
     } 
     else 
     { 
      k=k+"1"; 
      n=n/2; 
     } 
    } 
    for(int i=0;i<k.length();i++) 
    { 
     s1=k.charAt(i)+s1; 
    } 
    System.out.println("The respective binary number is : "+s1); 
    } 
    else 
    { 
     System.out.println("The respective binary number is : "+n); 
    } 
    } 
}