2010-12-16 2 views
1

Comment convertir un tableau de (00s ... 11s), la représentation binaire de chaque caractère, à une chaîne de caractères? Dans mon code je prends un tableau entier de longueur 64, puis divise le tableau plusieurs fois, chaque fois que je prends 8 indices équivalents à 8 bits, puis commence à partir de l'index 7 du tableau de longueur 8, puis multiplie la valeur de l'index par 2^numéro d'index qui devrait être 7 pour la première fois, puis 6. etc.)Comment convertir un tableau de (00s ... 11s), la représentation binaire de chaque caractère, en une chaîne de caractères

Mais je reçois une exception.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8 
    at testing.cipherText(testing.java:30) 
    at testing.main(testing.java:8) 

Si mon algorithme est incorrect, s'il vous plaît me dire

import java.util.*; 

public class testing { 

public static void main(String [] args) 
{ 
    int [] array ={0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1}; 
    String c = cipherText (array); 
    //System.out.print(i); 
} 

public static String cipherText (int [] array) 
{ 
    int decimal = 0; 
    int [] intA = new int [8]; 
    int from = array.length; 
    char x = 0; 
    int dre; 
    String s = null; 
    for (int i = 0; i < array.length; i = i + 8) 
    { 
      from=from-8; 
      intA=copyPartOfArray(array,from,8); 
      for (int j=0;j<intA.length;j++) 
      { 
       dre = (int) Math.pow (2.0, (double)7-i); 
       dre = dre * intA[i]; 
       decimal = decimal+dre; 
       x =(char)decimal; 
      } 
      s=x+s; 
     }   
     return s; 
    } 
    public static int [] copyPartOfArray (int [] a, int from, int to) // return a subArray 
    { 
     int [] result=new int [to]; 
     System.arraycopy(a,from, result, 0, to); 
     return result; 
    } 
} 
+2

écrire votre question avec un peu de ponctuation, s'il vous plaît .. Pour moi, il est difficile de comprendre votre flux de phrases – bluish

+0

je vous suggère d'essayer cela dans un débogueur. Je vous suggère également de chercher des moyens de simplifier votre code. Vous semblez également construire votre chaîne dans l'ordre inverse. –

+0

Si vous souhaitez multiplier un nombre par une puissance de 2, vous pouvez utiliser l'opérateur de décalage <<. –

Répondre

1

Ok, votre problème est que vous dites

dre = (int) Math.pow(2.0, (double) 7 - i); 
dre=dre*intA[i]; 

Je pense que vous vouliez

dre = (int) Math.pow(2.0, (double) 7 - j); 
dre=dre*intA[j]; 

Aussi, vous devriez initialiser votre chaîne

String s = ""; 

au lieu de

String s = null; 

Quelle sortie attendez-vous, à partir du tableau. Rappelez-vous également, les caractères en java sont 16bit unicode.

Pourtant, je ne pense pas que votre algorithme fonctionne encore tout à fait ... garderez recherche

0

vous pouvez comparer avec ...

public static String cipherText(int[] array) { 
    byte[] bytes = new byte[array.length/8]; 
    for (int i = 0; i < array.length; i += 8) 
     bytes[i/8] = (byte) ((array[i] << 7) + (array[i + 1] << 6) + (array[i + 2] << 5) + (array[i + 3] << 4) 
       + (array[i + 4] << 3) + (array[i + 5] << 2) + (array[i + 6] << 1) + array[i]); 
    return new String(bytes, 0); 
} 
+0

lorsque je lance la vôtre, j'ai testing.java utilise ou remplace une API obsolète. Remarque: Recompilez avec -Xlint: deprecation pour plus de détails. – Stive

+0

Il est déconseillé en faveur de new String (byte [], Charset) qui supporte le codage de caractères. Je suppose que vous n'avez pas utilisé un encodage de caractères, donc c'est approprié pour votre cas d'utilisation. –

3

Sans créer un nouveau tableau:

public static String cipherText(int[] array) { 
    StringBuilder s = new StringBuilder(); 
    for (int i = 0; i < array.length/8; i++) { 
     byte dec = 0; 
     for (int j = 0; j < 8; j++) { 
      int pow = 1 << 7 - j; // == Math.pow(2, 7 - j) 
      dec += array[i * 8 + j] * pow; 
     } 
     s.append((char) dec); 
    } 
    return s.toString(); 
} 
+0

merci ça marche .. j'aime la méthode – Stive

0

Sans utiliser pow ou <<, juste norme parseByte:

int [] array={0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1, 
       0,1,0,1,1,0,0,1}; 
StringBuilder buffer = new StringBuilder(); 
assert array.length % 8 == 0; 
for(int current:array) { 
    buffer.append(current); 
} 
int steps = array.length/8; 
byte [] letters = new byte[steps]; 
for(int i=0; i<steps; i++) { 
    letters[i] = Byte.parseByte(buffer.substring(i*8, i*8+8), 2); 
} 
String result = new String(letters); 
System.err.println(result); 

}

Questions connexes