2014-11-26 2 views
0

왜 wav 헤더를 잘못 읽었습니까?4 바이트 문자로 읽기

처음 8 바이트는 52 49 46 46 94 (E5) 37 03 (첫 번째 4 바이트 문자로 의미 마지막 4 바이트는 리틀 엔디안을이 int32된다)

QFile wavFile(fileName); 
QByteArray wavFileContent = wavFile.readAll(); 
qDebug() << "The size of the WAV file is: " << wavFileContent.size(); 

char *fileType = new char[4]; 
unsigned int fileSize; 

QDataStream analyzeHeaderDS(&wavFileContent,QIODevice::ReadOnly); 
analyzeHeaderDS.setByteOrder(QDataStream::LittleEndian); 

analyzeHeaderDS.readRawData(fileType,4); // "RIFF" 
analyzeHeaderDS >> fileSize;    // File Size 

qDebug() << "WAV File Header read:"; 
qDebug() << "File Type: " << QString::fromUtf8(fileType); 
qDebug() << "File Size: " << fileSize; 

출력은 :

The size of the WAV file is: 53994908 
WAV File Header read: 
File Type: "RIFFH??i?5" 
File Size: 53994900 

왜 "RIFF"뿐만 아니라 다른 것들이 있습니까? 4 바이트 문자를 할당하고 4 문자를 읽습니다. 다음 값 (파일 크기)이 정확합니다.

+0

4 바이트를 할당하는 FWIW 힙은 무의미한 것처럼 보입니다. 일정한 크기의 배열을 할당하십시오. 그렇게하면 메모리를 확보 할 필요가 없습니다. 따라서 코드가 현재 손상된 것으로 보이는 누출을 피하십시오. –

답변

1

QString::fromUtf8()char의 널 종결 배열을 필요로합니다. 반면에 길이가 4 인 배열은 char이고 null은 종료되지 않습니다. 따라서 해당 메소드 호출이 요구 사항을 충족시키지 못하고 결과 동작이 잘못 정의됩니다. 잘 모르겠어요

QString::fromUtf8(fileType, 4); 

: 당신이 fromUtf8()에 배열의 길이를 전달하면 http://qt-project.org/doc/qt-5/qstring.html#fromUtf8

함수는 널 (NULL) 종료에 대한 보이지 않는 것 :이 방법의 자세한 내용은 설명서를 참조 할 수 있습니다 여기 fromUtf8()이 올바른 선택입니다. 오히려 fromLocal8Bit이 더 적절하다고 생각합니다. 그래서 나는 이것을 좋아할 것입니다.

QString::fromLocal8Bit(fileType, 4); 
+0

답변 해 주셔서 다시 한 번 감사드립니다. 나는이 물건에 익숙하지 않고이 코드를 다음과 같이 수정했다. http://www.ptrackapp.com/apclassys-notes/qt-c-wav-file-reader/ imho에 버그가 있기 때문에 아마도 최고의 소스가 아닐 것이다. – user2366975

+0

fromAscii처럼 보이지 않는 것 같습니다 : http://qt-project.org/doc/qt-5/qstring-obsolete.html – user2366975

+0

대신 'fromLocal8Bit'을 사용하십시오. –