2016-09-16 12 views
0

8 개의 서로 다른 사인 값 (.getbytes 사용)을 텍스트 파일에 쓰는 코드를 작성했습니다. 나는 그에게 다음과 같은 포함 생성되는 파일을 실행 한 후문자열을 자바에서 원래 문자열로 변환합니다.

: 75ba3523 [B의 @ f4c7f77 [B의 @ 67446579 [B @ 20c92575 [B @ 1c515979 [B @ 5f18cd5 [B @ [B를 @ 3b621fe6 [지금 다른 자바 프로젝트에이 모든 과정을 반전하고 싶습니다

지금까지 너무 좋아 271c537f ...

@ B. 이를 위해 저는 예를 들어 [B @ 1c515979]를 0.7071 인 초기 값으로 돌려 놓는 방법을 알아야합니다.

은 내가 문자열로 다시 바이트 코드를 변환하는 희망있는

System.out.println("Text [Byte Format] : " + bytes.toString()); 

을 사용했습니다. 그래도 문제는 내가 텍스트 파일에서 읽었으므로 읽은 데이터가 어쨌든 문자열이라는 것, 그래서 실제로 문자열을 문자열로 변환하는 것입니다.

이것은 현재 상태입니다 ... 누구나 아이디어가 있습니까?

감사합니다.

+0

왜 처음에는 값을 텍스트로 저장하지 않습니까? – aviad

+0

문자열에서'getBytes()'를 호출합니까? 그런 다음'bytes.toString(); 대신'new String (bytes);을 사용해야합니다. – Clayn

+0

"지금까지는 너무 좋아"... 아니, 좋지 않아. 당신은 잘못된 방식으로 데이터를 쓰고 있습니다. [B @ ... 문자열은 바이트 배열의 표현이 아닙니다. 배열에는'toString' 메서드가 없기 때문에 이것들을 얻을 수 있습니다. – Jesper

답변

2

[[email protected]하는 바이트 아니라,이 기준의 문자열 표현이다. 다시 되돌릴 수는 없습니다.

public class Ref { 
    public static void main(final String[] args) { 
     System.out.println(new Ref()); 
    } 
} 
//Outputs: [email protected] 

[email protected]입니다. 실제로 파일에 값을 쓰지 않고 String으로 참조합니다. B[은 파일에 byte[]을 쓰고 있지만 그 배열이 이 아님을 의미합니다.

당신은 아마 이런 식으로 뭔가를 찾고

업데이트 : 당신이 보여

public static void main(final String[] args) throws FileNotFoundException, 
     IOException { 
    final File f = new File("/tmp/output"); 

    final ObjectOutputStream oos = new ObjectOutputStream(
      new FileOutputStream(f)); 

    for (int i = 0; i < 8; i++) { 
     final double d = Math.sin(i); 
     System.out.println(d); 
     oos.writeDouble(d); 
    } 

    oos.flush(); 
    oos.close(); 

    System.out.println("---"); 

    final ObjectInputStream ois = new ObjectInputStream(
      new FileInputStream(f)); 

    for (int i = 0; i < 8; i++) 
     System.out.println(ois.readDouble()); 

    ois.close(); 

} 
1

수 없습니다. 이미 모든 중요한 데이터를 잃어 버렸습니다. byte[]toString()을 호출하면 Java의 배열이 toString() ...을 덮어 쓰지 않으므로 아무런 도움이되지 않으므로 Object에서 구현을 얻습니다. 이는 유형 및 해시 코드 (실제로는 ID 해시 코드, 배열 용). 바이트 배열의 내용을 수정하고 toString()을 호출하면 동일한 값을 얻게됩니다.

대신 데이터 저장 방법을 변경해야합니다. 텍스트 파일이 전혀 필요 없다는 것이 이상적입니다 ...하지만 을 수행 할 경우에 텍스트 파일이 필요합니다. 가장 간단한 옵션은 이진 데이터를 base64로 변환하는 것입니다. java.util.Base64 사용 :

String text = Base64.getEncoder().encodeToString(bytes); 
// Write out text... 

... 

// String text = // read from a file 
byte[] bytes = Base64.getDecoder().decode(text); 
0

문자열 ([[email protected] 등) 바이트 값을 인코딩하지 않습니다. 대신 그들은 java.lang.Object의 기본 toString() 메소드의 출력 : 'class name'+ "@" 'hash code in hex'입니다.

다시 바이트 내용으로 변환 할 수 없습니다.

바이트를 쓰는 방법을 변경해야합니다. 각 바이트 배열을 쓰려면 DataOutputStream을 시도하십시오.

각 배열에 대해 DataOutputStream.writeInt()을 사용하여 배열의 길이를 쓰고 그 다음 바이트를 쓰십시오. 다시 읽으려면 DataInputStream을 사용하고 길이를 먼저 읽은 다음 해당 길이의 바이트 배열을 만든 다음 데이터를 다시 배열로 읽습니다.