2012-12-06 1 views
2

에 네 앞에 추가된다 : 파일 UTF-16으로 출력한다는, I는 다음의 방법을 이용하여 텍스트 파일에 바이트 배열을 출력있어 전면

try{ 
    FileOutputStream fos = new FileOutputStream(filePath+".8102"); 
    fos.write(concatenatedIVCipherMAC); 
    fos.close(); 
    }catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

인코딩 된 데이터, 예 : OE) GU3의«'DÃ {+ I-A] IO

:

¢의 ¬6î) ªÈP ~ m~LïiƟê • æ»가/# Ó ö¹ ¥는 '& ¼lG을 þ²XhÃ

그러나 ?

네 ¢ ¬6î) ªÈP ~ m~LïiƟê • æ»/ # Ó ö¹ ¥ 'þ²Xhà & ¼lG : 나는 데이터의 앞 앞에 추가 þÿ, 예를 얻을에 나는 다시 읽고 있어요 때 : OE) GU3«'Dà {+ I-A] IO

이 내가 파일에 읽기 위해 사용하고하는 방법입니다 :

private String getFilesContents() 
{ 
    String fileContents = ""; 
    Scanner sc = null; 

    try { 
     sc = new Scanner(file, "UTF-16"); 
     System.out.println("Can read file: "+file.canRead()); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    while(sc.hasNextLine()){ 
     fileContents += sc.nextLine();      
    } 
    sc.close(); 
    return fileContents; 
} 

다음 byte[] contentsOfFile = fileContents.getBytes("UTF-16");가로 문자열을 변환 바이트 배열.

구글이 "바이트 순서를 나타내지 만 Java가 거기에 있거나 Windows를 넣었습니까? 어떻게 내가 읽는 데이터의 시작 부분에?가 붙는 것을 피할 수 있습니까? 처음 2 바이트 만 무시하려고 생각했지만 Windows라면 분명히 다른 플랫폼에서 프로그램을 중단합니다.

편집 : 변경 사항이 앞에 붙습니다.

+1

음, 실제로는 * 텍스트 *와 같이 보이지 않습니다. * 의미하는 파일 내용은 무엇입니까? 바이너리 파일이 아니라고 확신합니까? –

+0

@JonSkeet AES-CBC를 사용하여 일부 데이터를 암호화했습니다. 파일은 IV + 데이터 + MAC입니다. 그것은 읽을 수있는 텍스트를 의미하지 않습니다? 나는 뭔가 다르게 행동해야 하는가? – Peanut

+0

스캐너를 사용하여 파일을 읽는 이유는 무엇입니까? 스캐너는 텍스트 파일 용입니다.귀하의 파일은 바이너리 파일입니다. –

답변

3

파일은 IV + 데이터 + MAC입니다. 그것은 읽을 수있는 텍스트를 의미하지 않습니다? 나는 뭔가 다르게 행동해야 하는가?

예. 당신은 텍스트 어디서나으로 취급하려고해서는 안됩니다.

실제로 임의의 2 진 데이터를 텍스트로 변환해야하는 경우 Base64를 사용하여 변환하십시오. 그 외에는 바이트 배열 인 InputStreamOutputStream을 사용해야합니다. 내가 정확히 모르는

은 왜 가정으로 추가 문자를 받고있어,하지만 당신은 시작하는 실제 텍스트를 가지고하지 않은 사실은 그 쪽을 진단 정말 가치가 없어 제안합니다. 이진 데이터 을 이진 데이터 대신으로 처리하기 시작하십시오.

편집 :

+0

좋아요. 스캐너 대신 FileInputStream을 사용할 것입니다. 간단하게하기 위해 (실제) 텍스트 파일을 읽는 방법을 사용하기 때문에 저는 이것을 사용하고있었습니다. 추신. 당신이 대답 해주는 멋진 일종의, 당신에 대해 많이 읽으십시오! – Peanut

+1

@Peanut : 내 편집 참조 - 구아바는 파일을 간단히 읽을 수 있도록 도와줍니다. –

+0

필자는 InputStream을 사용했으며 프로그램의 안정성을 크게 향상시킨 것으로 보입니다! prepending "문제를 해결하지 않았지만 나는 왜 내가 왜 분리 된 것 같아요 ... 텍스트 파일에서 일반 텍스트를 읽을 때 나는 질문에서 UTF-16으로 그 스캐너 메서드를 사용한 다음 나중에 plaintext.getBytes ("UTF-16")을 사용하여 바이트를 가져 와서 Cipher에 넣습니다. 이 두 가지를 모두 UTF-8로 변경하면 þÿ이 추가되지 않으므로 관련이 있습니다. 왜 그런가? 나는 그것을 UTF-8로 남겨두고 프로그램을 바꾸지 않을 수있다. – Peanut

2

þÿ은 ISO-8859-1로 해석 UTF16가 되실으로 저장 byte order mark (BOM) 유니 코드 문자입니다 ... GuavaIO helpers 단순성에서보세요. 당신이 이러한 오류를 피하려면

당신은 텍스트로 (어떤 인코딩) 바이너리 데이터를 처리해서는 안된다.

관련 문제