2016-11-14 5 views
0

파일의 체크섬이 필요하고 완벽하게 정상적으로 작동하는 this을 찾았습니다. 장치로이이 전달열려있는 QIODevice의 체크섬 가져 오기

if (!file.open(QFile::ReadOnly | QFile::Text)) 
{ 
    ... 
} 

이 (reader.read(&file);를) 읽을 수 : 이제 다음 줄에 아직 열리지 않은 QIODevice에 대한 포인터를 가지고이 기능을 변경하려면

bool XmlReader::read(QIODevice* device) 
{ 
    QByteArray b = fileChecksum(device); 
    ... 
} 

이를 내 fileChecksum 구현입니다. 체크섬을 반환하지만 나는 루프에서 영원히 잡히고 xml 구문 분석 오류가 발생합니다. 여기서 내가 뭘 잘못하고 있니? 내가 할

QByteArray XmlReader::fileChecksum(QIODevice* device) 
{ 
    if (device->isOpen()) 
    { 
     QCryptographicHash hash(QCryptographicHash::Sha256); 
     if (hash.addData(device)) { 
      return hash.result(); 
     } 

    } 
    return QByteArray(); 
} 

편집

바로 QByteArray b = fileChecksum(device); 후 :

구문 분석 오류가

인쇄 및 인쇄 및 인쇄를 유지 할말을 테잎에
qDebug() << "Checksum: " << b.toHex(); 

... : premature end of document를 쓰레기가되는 .

희망이 도움이됩니다.

+0

정확한 오류 텍스트를 올리실 수 있습니까? 또한 당신이 잡히는 루프가 무엇인지 명확하지 않습니다. 명확히 할 수 있습니까? – demonplus

+0

@tobilocker 오류는이 질문에 포함되지 않은 코드 부분에 있습니다. 'addData' 함수는 전체 파일을 읽고 커서를 "되감"하지 않으므로 자동 pos = device-> pos(); QByteArray b = fileChecksum (device); device-> seek (pos); ' – PeterT

+0

@PeterT 그랬어! 완전한! 당신이 그 라인을 답으로 추가한다면 그것을 받아 들일 수 있습니다. – tobilocker

답변

1

결국 오류의 원인이 된 코드 줄은보기에 있지 않으므로 나는 일어난 일에 대해서만 추측 할 수 있습니다.

fileChecksumhash.addData(device)이고 QIODevice until the end을 읽고 커서 위치를 유지합니다.

나중에 QIODevice에서 premature end of documen 메시지에 대한 설명을 읽으려고했을 가능성이 큽니다. 그냥

auto pos = device->pos(); 
QByteArray b = fileChecksum(device); 
device->seek(pos); 

로 나중에 위치를 다시 시도 할 수 있습니다하지만 당신은 (너무 비 랜덤 액세스 QIODevices을 지원하기 위해) 할 수있는 경우 한 번만 데이터를 읽어야 빠른 해결 방법으로

. 예를 들어 QBuffer에 결과를 저장하고이를 QIODevice로 사용할 수 있습니다. 이와 같이 :

bool XmlReader::read(QIODevice* device) 
{ 
    QByteArray contents = device->readAll(); 
    QBuffer buffer(&contents); 
    device = &buffer;//you can also just use &buffer from here on out instead of overwriting the pointer 
    QByteArray b = fileChecksum(device); 
    device->reset(); 
    /* ... further reads from device here */ 
} 
+0

추측 사실 확인! 감사. – tobilocker

+0

이 권한을 테스트하지 않았습니까? 위의 컴파일되지 않습니다. 제안 된 솔루션에는'QBuffer'에 몇 가지 오류가 있습니다. 'QByteArray contents = device.readAll();'는 장치가 포인터이기 때문에 분명히 작동하지 않습니다. 'QBuffer' 생성자는'QByteArray'에 대한 포인터를 취하므로'QBuffer buffer (& contents)'여야합니다. 또한 동일한 파서 오류 '문서의 조기 종료'가 발생합니다. – tobilocker

+0

@tobilocker 예, 컴파일하려고하지 않았습니다. 또한 오류가 계속 나타나면 아마 내가 가정하지 않은'XmlReader :: read' 함수 밖에서'device'를 읽었을 것입니다.나는 당신이 전달하는'QIODevice'가 무작위 접근 장치라는 것을 확인한 다음 초기 해결 방법을 의지 할 수 있습니다. – PeterT

관련 문제