2017-11-15 16 views
1

확장자가 vmd 인 파일 (Vocaloid Motion Data 0002)을 구문 분석하려고합니다. 나는 그것이 어떤 인코딩을 사용하는지 모른다. UTF-8, UTF-16, CS_ASCII 및 Windows-31j (Shift JIS)를 사용하여 시도했지만 아무 것도 작동하지 않았습니다. 그러나 대부분의 UTF-8은 바이트가 2이기 때문에 대부분의 문제를 해결해야합니다. 문자). 이 인코딩 문제, 또는 다른 문제가 있는지 궁금알 수없는 인코딩 파일은 어떻게 파싱합니까?

???~?N ??????????P ?Z???^?[ ??kkkkkkkk 

:

String testFile = rawFilePath+"/test.vmd"; 
BufferedWriter bw = null; 
FileWriter fw = null; 
fw = new FileWriter(outputPath+"/newFile.txt"); 
bw = new BufferedWriter(fw); 
BufferedReader fBr = new BufferedReader(new InputStreamReader(
    new FileInputStream(testFile), "UTF-8")); //US-ASCII windows-31j 
int count=0; 
String line; 
while ((line = fBr.readLine()) != null) { 
    System.out.println(line); 
    bw.write(line); 
    bw.write("\r\n"); 
    count++; 
    if(count > 3) { //print small portion of a larger file for testing 
     break; 
    } 
    ... 
} 

모두 인쇄 및 출력 파일은 다음과 같은 것을 쓴다? 어떻게 읽을 수있는 데이터를 파싱합니까?

+3

이진 파일은 인코딩이 없으며 공급 업체가 형식을 문서화하지 않으면 디코딩 할 수없는 * 리버스 엔진이없는 파일 그것을 보냈다. –

+0

파일 포맷터 http://mikumikudance.wikia.com/wiki/VMD_file_format 섹션의 파일 헤더 – logger

+2

아래에 작성 되었기 때문에 텍스트 파일 형식이 아닙니다. 설명서를 더 자세히 읽으십시오. 이진 파일 형식 사양입니다. 텍스트가 * string *을 몇 군데에서 사용하기 때문에 마술처럼 텍스트 파일이되지는 않습니다. –

답변

1

Vocaloid Motion Data는 (사용자가 제공 한 링크에서 언급했듯이) 바이너리 데이터이므로 텍스트로 변환하고 최상의 결과를 얻을 수 없습니다. 즉, 독자는 사용할 수 없지만 InputStreams을 사용해야합니다. DataInputStream이라는 InputStream이 있습니다. int와 float가 VMD에서 인코딩되는 경우 Java가 예상하는 것과 같은 방식으로 인코딩됩니다. 합리적인 값이 나오면 시도해 볼 수 있습니다. 황금색입니다. 그렇지 않으면 단일 바이트를 읽고 값을 계산하여 해당 결과를 직접 생성해야합니다 (예 : 데이터가 최하위 바이트의 첫 번째 순서 일 경우 등). .)

VMD에서 읽는 코드는 실제 파일이 없기 때문에 그림으로보아야합니다. 실제로 배열의 바이트 수를 읽는 지 확인하는 것과 같은 것들이 있습니다. 스트림의 끝 부분에 일찍 도달 한 경우 등

try (FileInputStream fis = new FileInputStream(new File("rawFilePath", "test.vmd"))) { 
    DataInputStream dis = new DataInputStream(fis); 
    byte[] nameBytes = new byte[15]; 
    dis.read(nameBytes); 
    int index = 0; 
    for (int i = 0; i < nameBytes.length; i++) { 
     if (nameBytes[i] == 0) { 
      index = i; 
      break; 
     } 
    } 
    String name = new String(nameBytes, 0, index, "8859_1"); 
    // Java ints are signed, so to keep an unsigned int we need long 
    long frameNumber = dis.readInt() & 0xffffffff; 
    float boneXPosCoordinate = dis.readFloat(); 
    float boneYPosCoordinate = dis.readFloat(); 
    float boneZPosCoordinate = dis.readFloat(); 
    float boneXRotCoordinate = dis.readFloat(); 
    float boneYRotCoordinate = dis.readFloat(); 
    float boneZRotCoordinate = dis.readFloat(); 
    float boneWRotCoordinate = dis.readFloat(); 
    byte[] interpolationData = new byte[64]; 
    dis.read(interpolationData); 
} 
+0

감사합니다. 덕분에 올바른 길로 나를 안내 할 수있었습니다. – logger

0

스트림을 byte 스트림으로 검사 할 수 있습니다. 그리고 검사를하는 동안 인코딩이 수행되는 방식에 따라 처음 몇 바이트를 직접 손으로 디코딩합니다. UTF 인코딩 작업 시작에 대한 좋은 정보는 https://en.wikipedia.org/wiki/Byte_order_mark을 참조하십시오.

+1

이것은이 포스터가 아닌 텍스트 파일을 읽고있는 경우에만 관련이 있습니다. 이진 데이터 컨텐츠에는 BOM이 없으며, 처음 몇 바이트에서 유사한 컨텐츠가 발생하더라도 정확한 정보는 아닙니다. –

+0

흥미 롭습니다. 스펙 (https://tools.ietf.org/html/rfc3629#page-6)은 기본 저장 유형과 관계없이 'UCS 문자 스트림'을 지정하는 것으로 보입니다. 또한 '텍스트 스트림의 시작 부분'에 나타나며 '선택 사항입니다.'라고 명시되어 있습니다. 그래서이 길로 내려가는 행운은별로 없을 것입니다. –

+0

http://mikumikudance.wikia.com/wiki/VMD_file_format에서 제공되는 OP의 파일 사양은 다르게 말하는 것 같습니다. 4 바이트 부동 소수점 및 정수는 텍스트가 아닙니다. –