2017-10-28 1 views
2

먼저 서명 (byte [] 서명)을 만듭니다. 그런 다음이 서명을 파일에 씁니다. 이 파일에서 서명을 읽고 다른 변수 (byte [] signatureCopy)를 지정합니다. 그러나이 두 변수를 비교할 때 거짓을 반환합니다. 어떻게 해결할 수 있습니까?배열은 동일한 바이트 배열에 대해 false를 반환합니다.

그러나 화면을 인쇄 할 때도 똑같이 보입니다.

System.out.println (new String (signature)); 
System.out.println (new String (signatureCopy)); 

코드 :

byte[] signature = this.signature(data);   
    FileUtil.writeRegistryFileSigned(path, signature); 
    byte[] signatureCopy = FileUtil.readSignatureInRegistryFile(path); 
    System.out.println(Arrays.equals(signature, signatureCopy)); //FALSE 

기능;

public static byte[] readSignatureInRegistryFile(String filePath){ 
    byte[] data = null; 
    try { 
     data = Files.readAllBytes(Paths.get(filePath)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return data;   
} 


public static void writeRegistryFileSigned(String filePath, byte[] signature) { 
    File fileRegistry = new File(filePath); 
    try { 
     fileRegistry.createNewFile(); 
    } catch (IOException e1) { 

    } 
    try (FileWriter fw = new FileWriter(fileRegistry, true); 
      BufferedWriter bw = new BufferedWriter(fw); 
      PrintWriter out = new PrintWriter(bw)) {    
     out.println(new String(signature)); 

    } catch (IOException e) { 
    } 

} 
+2

이진 데이터를 쓰는 데 Writer를 사용하지 마십시오. OutputStream를 사용한다. 새로운 String (서명)은 (바이트 배열이 기본 charset을 사용하여 인코딩 된 문자를 나타내지 않기 때문에) 의미가없는 손실 연산이며 println()은 EOL 문자를 추가합니다. –

+0

고맙습니다. OutputStream이 작동했습니다. Writer가 작동하지 않는 이유는 무엇입니까? 설명 할 수 있니? – cezaalp

+1

나는 이미있다. 내 의견을 다시 읽으십시오. –

답변

5

당신은 CR-LF 또는 LF를 문자열에 추가하는 println을 사용하여 작성하고 있습니다.

readAllBytes는 CR-LF 또는 LF를 포함한 모든 바이트를 실제로 읽습니다.

따라서 인쇄 된 문자열이 동일하게 보이지만 배열은 다릅니다. (추가 줄 바꿈에 유의해야합니다.)

더욱이 : 바이트를 String으로 변환하면 일부 인코딩이 적용되며 원하는 결과가 생성되거나 생성되지 않을 수 있습니다. 서명이 바이트 배열 인 경우 인쇄용으로 String으로 변환하지 말고 바이트 값을 숫자 값으로 16 진수로 인쇄하십시오.

+0

잘 설명되어 있습니다. 나는 왜 그것이 '사실'을 인쇄하지 않는지 궁금해하고 있었다. – Razib

관련 문제