2011-03-31 33 views
14

Tengo una matriz de bytes que estoy encriptando y luego convirtiendo en una cadena para que pueda ser transmitida. Cuando recibo la cadena, debo convertir la cadena nuevamente en una matriz de bytes para que pueda descifrarla. He comprobado que la cadena recibida coincide con la cadena enviada (incluida la longitud), pero cuando uso algo como str.getBytes() para convertirlo en una matriz de bytes, no coincide con mi matriz de bytes original.Convertir cadena de Java en matriz de bytes

ejemplo de salida:

SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3 
SENT STR: [[email protected] 
RECEIVED STR: [[email protected] 
RECEIVED: W0JAM2U0YTlhN2Q= 

alguna idea de cómo puedo convertir la cadena recibida a una matriz de bytes que coincide con la matriz de bytes enviados?

Gracias

+3

Para convertir cadena a matriz de bytes utilizar este: Cadena stringToConvert = "Esta cadena tiene 76 caracteres y se convertirá en una matriz de bytes"; byte [] theByteArray = stringToConvert.getBytes(); –

+1

W0JAM2U0YTlhN2Q = es Base64 para [B @ 3e4a9a7d, que se ve como una representación de Cadena para una matriz de bytes en Java. Si está realizando la manipulación de byte usted mismo, vuelva a verificarlo ya que puede estar enviando datos incorrectos. – mdrg

+0

fuera es mi matriz de bytes y cuando se imprime da la primera línea de mi salida de ejemplo. Out.toString() definitivamente me da [B @ 3e4a9a7d – Mitch

Respuesta

16

Se utilizaron array.toString(), que se implementa como esto:

return "[[email protected]" + Integer.toString(this.hashCode(), 16); 

(. De hecho, se hereda la definición del objeto, y la parte antes de la @ simplemente es el resultado de getClass().getName())

Y el hashCode aquí no depende del contenido.

En su lugar, utilice una cadena nueva (matriz, codificación).

Por supuesto, esto solo funciona para byte-arrays que son realmente representables como cadenas de Java (que luego contienen caracteres legibles), no para matrices arbitrarias. Es mejor usar base64 como Bozho recomendado (pero asegúrese de usarlo en ambos lados del canal).

+0

Gracias, esta fue una solución rápida al problema – Mitch

5

Esto se parece a Base64. Eche un vistazo a commons-codecBase64 clase.

+0

Probé utilizando sun.misc.BASE64Decoder, que creo que es muy similar y no parece funcionar para mí – Mitch

+1

@Mitch try 'string.getBytes (" ISO-8859-1 ")', y luego pasar eso como un constructor también. – Bozho

+2

@Mitch no utiliza ninguna clase de los paquetes 'sun. *'.Son API propietarias y pueden eliminarse en cualquier momento. Use cualquier otra implementación pública, como la sugerida por Bozho. – mdrg

4

No puede usar getBytes() en dos máquinas diferentes, ya que getBytes utiliza el juego de caracteres predeterminado de la plataforma.

Decodifique y codifique la matriz con un juego de caracteres específico (es decir, UTF-8) para asegurarse de obtener los resultados correctos.

1

En primer lugar hacer la conversión de la matriz de bytes a cadena adecuada, haciendo

String line= new String(Arrays.toString(your_array)) 

A continuación, enviarlo y la función utilizar a continuación

public static byte[] StringToByteArray(String line) 
{ 

    String some=line.substring(1, line.length()-1);  
    int element_counter=1; 

    for(int i=0; i<some.length(); i++) 
    {   
     if (some.substring(i, i+1).equals(",")) 
     { 
      element_counter++; 
     }  

    } 
    int [] comas =new int[element_counter-1]; 
    byte [] a=new byte[element_counter]; 
    if (a.length==1) 
    { 
     a[0]= Byte.parseByte(some.substring(0)); 
    }  
    else 
    { 
     int j=0; 
     for (int i = 0; i < some.length(); i++) 
     { 
      if (some.substring(i, i+1).equals(",")) 
      { 
       comas[j]=i; 
       j++; 
      } 
     }   
     for (int i=0; i<element_counter; i++) 
     { 
      if(i==0) 
      { 
       a[i]=Byte.parseByte(some.substring(0, comas[i])); 
      } 
      else if (i==element_counter-1) 
      { 
       a[i]=Byte.parseByte(some.substring(comas[comas.length-1]+2)); 
      } 
      else 
      { 
       a[i]=Byte.parseByte(some.substring(comas[i-1]+2, comas[i])); 
      } 

     } 
    } 
    return a; 

} 
Cuestiones relacionadas