복붙노트

[HADOOP] Base64 데이터의 스트림 디코딩

HADOOP

Base64 데이터의 스트림 디코딩

나는 큰 base64로 인코딩 된 데이터를 가지고있다. (hadoop 파일 시스템에 적당한 파일에 저장되어있다.) 이 데이터는 원래 gzipped 텍스트 데이터였습니다. 이 인코딩 된 데이터의 청크를 읽고 해독 한 다음 GZIPOutputStream으로 플러시 할 수 있어야합니다.

배열에 전체 base64 데이터를로드하고 Base64.decodeBase64 (byte [])를 호출하는 대신이 작업을 수행 할 수있는 방법에 대한 아이디어가 있습니까?

'\ r \ n'구분 기호까지 문자를 읽고 라인별로 디코드하면 맞습니까? 예 : :

for (int i = 0; i < byteData.length; i++) {
    if (byteData[i] == CARRIAGE_RETURN || byteData[i] == NEWLINE) {
       if (i < byteData.length - 1 && byteData[i + 1] == NEWLINE)
            i += 2;
       else 
            i += 1;

       byteBuffer.put(Base64.decodeBase64(record));

       byteCounter = 0;
       record = new byte[8192];
    } else {
        record[byteCounter++] = byteData[i];
    }
}

안타깝게도이 접근법은 인간이 읽을 수있는 결과를 제공하지 않습니다. 이상적으로는 데이터를 읽고, 디코드하고, 스트리밍하고 싶습니다.

지금은 inputstream에 넣고 gzipout에 복사하려고합니다.

byteBuffer.get(bufferBytes);

InputStream inputStream = new ByteArrayInputStream(bufferBytes);
inputStream = new GZIPInputStream(inputStream);
IOUtils.copy(inputStream , gzipOutputStream);

그리고 그것은 나에게 java.io.IOException : 손상된 GZIP 예고편

해결법

  1. ==============================

    1.단계별로 단계별로 나가자.

    단계별로 단계별로 나가자.

    대략이 논리는 다음과 같습니다.

    InputStream fromHadoop = ...;                                  // 3rd paragraph
    Base64InputStream b64is =                                      // 2nd paragraph
        new Base64InputStream(fromHadoop, false, 80, "\n".getBytes("UTF-8"));
    GZIPInputStream zis = new GZIPInputStream(b64is);              // 1st paragraph
    

    Base64InputStream (행 길이 및 행 끝 바이트 배열) 인수에주의를 기울여주십시오.이를 조정해야 할 수도 있습니다.

  2. ==============================

    2.나를 올바른 방향으로 인도 해준 Nikos에게 감사드립니다. 특히 이것은 내가 한 일입니다.

    나를 올바른 방향으로 인도 해준 Nikos에게 감사드립니다. 특히 이것은 내가 한 일입니다.

    private static final byte NEWLINE = (byte) '\n';
    private static final byte CARRIAGE_RETURN = (byte) '\r';
    
    byte[] lineSeparators = new byte[] {CARRIAGE_RETURN, NEWLINE};      
    Base64InputStream b64is = new Base64InputStream(inputStream, false, 76, lineSeparators);
    
    GZIPInputStream zis = new GZIPInputStream(b64is);
    

    Base64 라인의 길이가 76이 아닌가? 그래도 나는 80 세를 가지지 않았다.

  3. from https://stackoverflow.com/questions/19980307/stream-decoding-of-base64-data by cc-by-sa and MIT license