2011-03-31 7 views
14

바이트 배열을 암호화하여 전송할 수 있도록 문자열로 변환합니다. 문자열을 받으면 해독 할 수 있도록 문자열을 바이트 배열로 다시 변환해야합니다. 수신 된 문자열이 길이를 포함한 전송 된 문자열과 일치하는지 확인했지만 str.getBytes()와 같은 것을 사용하여 바이트 배열로 변환하면 원래 바이트 배열과 일치하지 않습니다.Java 문자열을 바이트 배열로 변환

출력 예 :

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

어떤 아이디어가 나는 전송 바이트 배열과 일치하는 바이트 어레이에 수신 된 문자열을 변환 할 수 있는가?

감사합니다.

+3

아래 기능을 사용할 수를 적절한 문자열로 바이트 배열의 convertion을 stringToConvert = "이 문자열은 76 자이며 바이트 배열로 변환됩니다."; 바이트 [] theByteArray = stringToConvert.getBytes(); –

+1

W0JAM2U0YTlhN2Q = [B @ 3e4a9a7d에 대한 Base64, 자바의 바이트 배열에 대한 문자열 표현처럼 보입니다. 직접 바이트 조작을 수행하는 경우 잘못된 데이터를 전송할 수 있으므로 다시 확인하십시오. – mdrg

+0

out은 내 바이트 배열이고 인쇄 될 때 내 예제 출력의 첫 번째 줄을 제공합니다. out.toString() 확실히 날 준다 [B @ 3e4a9a7d – Mitch

답변

16

당신은 다음과 같이 구현 array.toString()를 사용 여기서 hashCode는 내용에 의존하지 않습니다.

대신 새 문자열 (배열, 인코딩)을 사용하십시오.

물론 이것은 임의의 배열이 아닌 Java 문자열 (실제로 읽을 수있는 문자 포함)로 표현 될 수있는 바이트 배열에서만 작동합니다. Bozho와 같이 base64를 사용하는 것이 좋습니다 (채널의 양쪽면에서 사용하십시오).

+0

감사합니다. 문제의 빠른 해결 방법이었습니다. – Mitch

5

이것은 Base64처럼 보입니다. commons-codecBase64 클래스를 살펴보십시오.

(.이 개체의 정의, 단순히 getClass().getName()의 결과 인 @ 전에 일부를 상속 사실)
return "[[email protected]" + Integer.toString(this.hashCode(), 16); 

그리고 :

+0

나는 매우 유사하다고 생각하는 sun.misc.BASE64Decoder를 사용해 보았고 나를 위해 작동하지 않았다. – Mitch

+1

@Mitch try'string.getBytes ("ISO-8859-1 ")', 그리고 그것을 생성자로 전달합니다. – Bozho

+2

@Mitch는'sun. *'패키지의 클래스를 사용하지 않습니다.API는 독점적 인 API이므로 언제든지 삭제할 수 있습니다. Bozho가 제안한 것과 같은 다른 공개 구현을 사용하십시오. – mdrg

4

getBytes는 plattform의 기본 charset을 사용하기 때문에 두 개의 다른 시스템에서 getBytes()를 사용할 수 없습니다.

올바른 결과를 얻으려면 배열을 지정된 charset (즉, UTF-8)로 디코딩하고 인코딩해야합니다. 문자열 :

1

먼저 배열이를 사용하여 바이트 열로 변환

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

을 수행하여, 그 다음을 보내고

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; 

} 
관련 문제