csplit não reconhecendo o regexp fornecido

4

Estou trabalhando neste grande arquivo ( DATA.DAT , ~ 900MB) que contém vários outros arquivos. É de um jogo de PS2.

Amostras de som (que estão no formato .AIFF ), precisamente o que eu estou procurando, compõem a maior parte do tamanho.

Depois de pesquisar na web por extratores .DAT do PS2, descobri que eles são basicamente dependentes do desenvolvedor e, como esse jogo / ferramenta é bastante obscuro e não está achando muito online, pensei em automatizar o processo eu mesmo.

Inspecionando o arquivo em um editor hexadecimal Conheci alguns cabeçalhos .AIFF , clonei os fragmentos em novos arquivos .AIFF e, sem mais nenhum trabalho, eles foram reproduzidos.

Tendo passado algum tempo tirando a ferrugem do meu conhecimento basico MUITO limitado e tendo lido perguntas semelhantes aqui, descobri esta expressão:

gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'

(Eu estou no OSX usando coreutils, daí o prefixo g no csplit)

Dado que os arquivos .AIFF iniciam com a string "FORM" e dado que basicamente todas as amostras no arquivo estão próximas umas das outras (espaçadas por quantidades de dados que não geram fim de ruído nas amostras), eu pensei que o regexp

/FORM/

seria suficiente para dividir os arquivos.

No entanto, todos os arquivos divididos estão sendo exibidos com dados inúteis que ficam entre os exemplos de som antes do cabeçalho .AIFF , tornando-os impróprios.

Capturas de tela dos dados hexadecimais de uma amostra de som dividida abaixo:

Estaamostrarealcomeçaaproximadamenteemtornodamarcade1500bytes:

O que está fazendo essa expressão dividir os arquivos com um deslocamento?

    
por João 26.11.2017 / 05:02

2 respostas

2

O Csplit é um utilitário de texto. É baseado em linha. Um padrão /FORM/ significa “uma linha contendo FORM ”. Uma linha é uma sequência de bytes diferente de LF (alimentação de linha, também conhecida como nova linha, que pode ser escrita \n , ^ J,…), seguida por um byte LF (ou pelo final do arquivo, com utilitários GNU ). Assim, o "lixo" que você observa é o que quer que esteja entre o caractere LF anterior e a substring FORM .

A página de manual e a descrição --help curta presumem que você já sabe o que o comando faz, então eles apenas mencionam “partes” sem explicação. Você precisa ler a documentação completa para obter uma descrição do que as peças são .

Você não pode fazer o que quiser com o csplit. Você pode fazer isso com o GNU awk. (Outras versões do awk podem não ter os recursos necessários - suporte a separadores de registros arbitrários e lidar com bytes nulos.) Não testado:

gawk -v RS='FORM' -v ORS='' '{
    print "FORM" $0 >sprintf("sample-%04d.aif", n++)
}' DATA.DAT

Mas isso pode ser cortado em locais espúrios se os dados compactados contiverem apenas os quatro bytes FORM . Isso pode ser bom o suficiente para uma operação única com revisão manual, mas seria melhor se você precisasse de algo confiável.

    
por 26.11.2017 / 13:32
0

Um utilitário baseado em texto não é apropriado para manipular arquivos binários.

Você provavelmente obterá melhores resultados com Lib / aifc , PySoundFile ou o aplicativo de linha de comando ffmpeg .

    
por 26.11.2017 / 07:38

Tags