2012-11-18 3 views
0

Java에서 저장 될 때 바이트 채우기되는 이진 파일을 읽으므로 읽을 때 작업을 되돌려 야합니다. 스터핑은 FF 바이트 다음에 여분의 0 바이트를 추가합니다. 0 바이트는 읽을 때 무시해야합니다. 나는 DataInputStream을 사용하여 파일을 읽었지만, 프로그램의 해당 부분에 대해 "원시"read-to-array 함수 만 사용하는 방법을 보면서 차이점을 찾아 볼 수는 없습니다. , 기본적으로 Java에서 바이트 채우기를 처리하는 방법은 무엇입니까?

public static byte[] unstuff(byte[] stuffed) { 
    int bytesToSkip = 0; 
    for(int i=0;i<stuffed.length - 1;++i) { 
     if(stuffed[i] == 0xFF && stuffed[i+1] == 0) { 
      ++bytesToSkip; 
     } 
    } 
    if(bytesToSkip == 0) return stuffed; 

    byte unstuffed[] = new byte[stuffed.length - bytesToSkip]; 
    int j=0; 
    for(int i=0;i<stuffed.length - 1;++i) { 
     if(stuffed[i] == 0xFF && stuffed[i+1] == 0) { 
      ++i; 
      continue; 
     } 
     else { 
      unstuffed[j] = stuffed[i]; 
      ++j; 
     } 
    } 
    return unstuffed; 
} 

이 함수는 바이트 수를 생략 할 수 계산 다음의 해당 번호에 의해 원래의 박제 배열보다 짧은의 배열을 할당 :

어쨌든

, 여기에 내가 지금까지있어 무엇 바이트를 복사하고이를 복사하여 원하지 않는 0 바이트를 건너 뜁니다.

질문 :이 작업을 수행하는 다른 방법이 있습니까? 더 매끄럽고 효율적이며 직관적입니까? 바이트를 다른 컨테이너에 넣은 다음 전체 배열을 복사하는 대신이를 제거하면 더 잘 작동합니까?

+0

작성하시오있는 ByteArrayOutputStream에)' ByteArayOutputStream를 byte 배열로 변환하는 메서드. Incidenta ;; y 왜 for (int i = 0; i

+0

@SteveAtkinson 질문에 대한 답은'채워진 [i + 1]'에 있습니다. –

+0

배열은 항상 FF00 시퀀스로 끝나는 것으로 가정합니다.) –

답변

1

가장 좋은 방법은 스쿼시에 FF 00 원래 배열을 사용하는 것입니다. 조건이 충족 될 때마다 대상 인덱스를 증가시키지 마십시오. 끝나면 배열에 원하는 시퀀스가 ​​포함되지만 너무 커서 결국 끝에 여분의 바이트가 생깁니다. 그런 다음 더 짧은 배열로 복사하거나 원본을 그대로 사용하지만 배열에 offset + count를 받아들이고 더 낮은 bytecount를 전달하는 메서드로 전달합니다.

int target = 0; 
for (int i = 1; i < stuffed.length; ++i) { 
    if (stuffed[i-1] == 0xFF && stuffed[i] == 0) continue; 
    if (i != target) stuffed[target++] = stuffed[i]; 
} 
1

당신은 InputStream 자체 래퍼로 할 수있는 : 당신이 배열을 스캔하고 입력 배열을 스캔 한 후,`toByteArray를 (사용하고 같은

new DataInputStream(new FilterInputStream(stream)) { 
    int buf = -1; 

    public int read() { 
    if (buf != -1) { 
     int result = buf; 
     buf = -1; 
     return result; 
    } else { 
     int b = super.read(); 
     if (b == 0xFF) { 
     super.skip(1); // skip the 0 byte 
     } 
     return b; 
    } 
    } 

    public int read(byte[] bytes, int off, int len) { 
    int dst = 0; 
    while (dst == 0) { 
     int readBytes = super.read(bytes, off, len); 
     if (readBytes == -1) return -1; 
     int dst = 0; 
     for (int i = 0; i < readBytes; i++) { 
     bytes[off + dst] = bytes[off + i]; 
     if (bytes[off + i] == (byte) 0xFF) { 
      i++; // skip the 0 byte afterwards 
     } 
     } 
    } 
    return dst; 
    } 
} 
관련 문제