파일을 Base64String으로 변환하고 다시 다시 변환


108

제목은 모든 것을 말합니다.

  1. 나는 그렇게 tar.gz 아카이브에서 읽었다.
  2. 파일을 바이트 배열로 나누기
  3. 해당 바이트를 Base64 문자열로 변환
  4. Base64 문자열을 다시 바이트 배열로 변환
  5. 해당 바이트를 새 tar.gz 파일에 다시 씁니다.

두 파일의 크기가 같은 것을 확인할 수 있지만 (아래 방법이 true를 반환 함) 더 이상 복사본 버전을 추출 할 수 없습니다.

내가 뭔가를 놓치고 있습니까?

Boolean MyMethod(){
    using (StreamReader sr = new StreamReader("C:\...\file.tar.gz")) {
        String AsString = sr.ReadToEnd();
        byte[] AsBytes = new byte[AsString.Length];
        Buffer.BlockCopy(AsString.ToCharArray(), 0, AsBytes, 0, AsBytes.Length);
        String AsBase64String = Convert.ToBase64String(AsBytes);

        byte[] tempBytes = Convert.FromBase64String(AsBase64String);
        File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);
    }
    FileInfo orig = new FileInfo("C:\...\file.tar.gz");
    FileInfo copy = new FileInfo("C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

편집 : 작업 예제는 훨씬 더 간단합니다 (@TS 덕분에).

Boolean MyMethod(){
    byte[] AsBytes = File.ReadAllBytes(@"C:\...\file.tar.gz");
    String AsBase64String = Convert.ToBase64String(AsBytes);

    byte[] tempBytes = Convert.FromBase64String(AsBase64String);
    File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);

    FileInfo orig = new FileInfo(@"C:\...\file.tar.gz");
    FileInfo copy = new FileInfo(@"C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

감사!


이렇게 압축 된 파일의 내용을 변경할 수는 없습니다. 파일을 그대로 직접 읽는 대신 1 단계에서 파일의 압축을 풀어야합니다. 그런 다음 5 단계도 마찬가지로 바이트를 직접 쓰는 대신 데이터를 다시 압축해야합니다.
itsme86

다행히도 파일 자체에 대한 실제 조작이 없었기 때문에 (기본적으로 A 지점에서 B 지점으로 이동)이 특정 작업에는 (해제 /) 압축이 필요하지 않습니다
darkpbj 2014 년

답변:


289

어떤 이유로 파일을 base-64 문자열로 변환하려는 경우. 인터넷 등을 통해 전달하고 싶다면 이렇게 할 수 있습니다.

Byte[] bytes = File.ReadAllBytes("path");
String file = Convert.ToBase64String(bytes);

그리고 이에 따라 파일로 다시 읽습니다.

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);

감사합니다는 정보를, 나는 아래의 대답과 함께가는 시도했지만 didnt가 도움이 있지만, 이것은 단순한 OpenFileDialog를 내 문제를 해결하기 위해 듯
미스터 SirCode

ToBase64String이 System.OutOfMemoryException을 반환하면 어떻게됩니까? 어떻게 큰 파일과 제한된 메모리를 최적화 할
Olorunfemi Ajibulu

@OlorunfemiAjibulu 그렇다면 스트림을 사용해야 할 것 같습니다. 또는 문자열을 여러 부분으로 나눕니다. 한 번은 암호화 된 청크를 저장 한 대용량 파일에 대한 사용자 지정 암호화를 작성했습니다. 청크 크기의 정수 값을 저장하기 위해 4 바이트를 추가했습니다. 이런 식으로 우리는 많은 위치를 읽는 것을 알았습니다
TS

흥미로운 @TaylorSpark. 나는 스트림을 사용했고 나는 괜찮았다.
Olorunfemi Ajibulu

3
private String encodeFileToBase64Binary(File file){    
String encodedfile = null;  
try {  
    FileInputStream fileInputStreamReader = new FileInputStream(file);  
    byte[] bytes = new byte[(int)file.length()];
    fileInputStreamReader.read(bytes);  
    encodedfile = Base64.encodeBase64(bytes).toString();  
} catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
} catch (IOException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
}  
    return encodedfile;  
}

3
이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다. 양질의 답변을 제공 하려면방법 답변 을 읽어 보세요.
thewaywewere

1
다시 말하지만 javaOP가 사용한다면 왜 필요 c#합니까?
TS

@TS 왜 다시 우리는 자바가 필요합니까?
클릭 Ok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.