저는 이 대용량 파일을 작업 중입니다(데이터.DAT, ~900MB) 여기에는 다른 여러 파일이 포함되어 있습니다. PS2 게임에서 나온 내용입니다.
사운드 샘플(위치:.AIFF형식)이 내가 추구하는 형식이며 크기의 대부분을 차지합니다.
PS2를 온라인으로 검색한 후.DAT나는 그들이 기본적으로 개발자에 의존한다는 것을 알았고, 이 게임/도구는 꽤 모호하고 온라인에서 이에 대한 많은 정보를 찾을 수 없기 때문에 프로세스를 직접 자동화하려고 생각하고 있습니다.
Hex Editor에서 파일을 검사하는 동안 몇 가지 문제를 발견했습니다..AIFF헤더, 블록을 새 블록에 복제.AIFF파일이 있으면 추가 작업 없이 재생할 수 있습니다.
매우 제한된 bash 지식에서 벗어나 여기에서 비슷한 질문을 읽고 다음 표현을 생각해내는 데 시간이 걸렸습니다.
gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'
(저는 OSX에서 coreutils를 사용하고 있으므로 csplit에서는 g- 접두사를 사용합니다)
반면.AIFF파일은 문자열 "FORM"으로 시작하고 파일의 모든 샘플이 본질적으로 서로 옆에 있다는 점(샘플에 원치 않는 종료 노이즈를 생성하지 않는 무시할 수 있는 양의 데이터 간격)을 고려하여 정규 표현식이 다음과 같다고 생각했습니다. 방법
/FORM/
파일을 분리하는 것으로 충분합니다.
그러나 각 분할 파일은 사운드 샘플 사이에 있는 가비지 데이터를 출력합니다..AIFF제목이 재생 불가능하게 됩니다.
다음은 사운드 샘플을 분할하는 16진수 데이터의 스크린샷입니다.
이 실제 예제는 약 1500바이트에서 시작됩니다.
이 표현식이 파일을 오프셋으로 분할하는 이유는 무엇입니까?
답변1
Csplit은 텍스트 유틸리티입니다. 라인 기반입니다. 패턴은 /FORM/
" FORM
포함하는 줄"을 의미합니다. 라인은 LF(newline이라고도 하며 , ^J, …로 쓸 수 있는 newline) 이외의 바이트 시퀀스이며 그 \n
뒤에는 LF 바이트(또는 GNU 유틸리티를 사용할 경우 파일 끝에)가 있습니다. 따라서 관찰한 "쓰레기"는 FORM
이전 LF 문자와 하위 문자열 사이의 모든 것입니다.
매뉴얼 페이지와 --help
간단한 설명에서는 명령이 수행하는 작업을 이미 알고 있다고 가정하므로 설명 없이 "조각"만 언급합니다. 너는 읽어야 해완전한 문서해당 부분에 대한 설명을 확인하세요.
csplit로는 원하는 것을 할 수 없습니다. GNU awk를 사용하여 이를 수행할 수 있습니다. (다른 버전의 awk에는 임의의 레코드 구분 기호 및 널 바이트 처리 지원 등 필요한 기능이 없을 수 있습니다.)
gawk -v RS='FORM' -v ORS='' '{
print "FORM" $0 >sprintf("sample-%04d.aif", n++)
}' DATA.DAT
그러나 압축된 데이터에 정확히 4바이트가 포함되어 있으면 FORM
잘못된 위치에서 잘릴 수 있습니다. 이는 수동 검사의 일회성 작업에 충분할 수 있지만 신뢰할 수 있는 것이 필요한 경우 형식 인식 도구를 사용하는 것이 좋습니다.