xml 파일에 저장되고 프로그램 시작시로드되는 userbase를 포함하는 응용 프로그램이 있습니다. 이 목적으로 QXmlStreamWriter/Reader를 사용합니다. 암호화 된 (해쉬 된?) 암호 형식 (QCryptographicHash 및 Sha256 사용)을 직렬화하려고하면이 문제가 발생합니다.암호화 된 암호를 XML로 serialize
QCryptographicHash QByteArray는 QString으로 변환 될 수 있습니다 (QXmlStreamWriter/Reader 사용시 필요). 아래 관련 코드. 모든 것은 serialization (로그인 할 수 있습니다.) 전에는 제대로 작동하지만 xml에서 데이터를 읽을 때 해쉬 된 암호를 찾은 후에 함수는 EOF를 찾은 것처럼 동작하고 QXmlStreamReader에 의해 QString에 약 2 개의 문자 만로드됩니다.
코드에서 예약 등 (영화 패널 임)을 무시하십시오. 관련 조각은 암호이며, 경우에 대비해 모든 기능을 제공합니다.
가 나는 문제가 무엇인지 설명 희망, 여기 내 코드의 조각이다
QString hash = QCryptographicHash::hash(pass.toUtf8(), QCryptographicHash::Sha256);
User* user_pointer;
user_pointer = new User(name, hash, admin);
:
등록 기능 (해시는, 패스는 QString이다) (주 해싱 모든 것이 잘 작동 추가하기 전에)
쓰기 기능 :
QFile file("users/users.xml");
if(!file.open(QIODevice::WriteOnly))
throw "Error podczas otwierania bazy użytkowników!";
QXmlStreamWriter writer (&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("USERS");
int list_size = userList.size();
for(int i = 0; i < list_size; i++)
{
writer.writeStartElement("USER");
writer.writeTextElement("name", userList.at(i)->name);
writer.writeTextElement("pass", userList.at(i)->password);
writer.writeTextElement("admin", QString::number(userList.at(i)->is_admin));
writer.writeStartElement("RESERVATIONS");
for(int m = 0; m < userList.at(i)->reservList.size(); m++)
{
writer.writeStartElement("reservation");
writer.writeTextElement("moviename", userList.at(i)->reservList.at(m)->movie_name);
writer.writeTextElement("date", userList.at(i)->reservList.at(m)->date.toString("dd.MM.yyyy"));
writer.writeTextElement("hour", (userList.at(i)->reservList.at(m)->hour).toString("hhmm"));
writer.writeTextElement("paid", QString::number(userList.at(i)->reservList.at(m)->paid));
for(int n = 0; n < userList.at(i)->reservList.at(m)->placeList.size(); n++)
writer.writeTextElement("place", QString::number(userList.at(i)->reservList.at(m)->placeList.at(n)));
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndElement();
}
writer.writeEndDocument();
file.close();
}
읽기 기능 :
QFile file("users/users.xml");
if(!file.open(QIODevice::ReadOnly))
throw "Brak bazy danych użytkowników lub błąd jej otworzenia!";
QXmlStreamReader reader;
reader.setDevice(&file);
reader.readNext();
QString user_name;
QString user_pass;
bool admin;
QString movie_name;
QTime hour;
QDate date;
bool paid;
User* user_pointer = NULL;
int user_counter = -1;
Reservation* reserv_pointer = NULL;
int reserv_counter = -1;
while(!reader.atEnd())
{
if(reader.isStartElement())
{
if(reader.name() == "USER")
{
reserv_counter = -1;
}
if(reader.name() == "name")
user_name = reader.readElementText();
if(reader.name() == "pass")
user_pass = reader.readElementText();
if(reader.name() == "admin")
{
admin = reader.readElementText().toInt();
user_pointer = new User(user_name, user_pass, admin);
userList.append(user_pointer);
user_counter++;
}
if(reader.name() == "reservation")
{
reserv_counter++;
}
if(reader.name() == "moviename")
movie_name = reader.readElementText();
if(reader.name() == "hour")
hour = QTime::fromString(reader.readElementText(), "hhmm");
if(reader.name() == "date")
date = QDate::fromString(reader.readElementText(), "dd.MM.yyyy");
if(reader.name() == "paid")
{
paid = reader.readElementText().toInt();
reserv_pointer = new Reservation(movie_name, date, hour, paid);
userList.at(user_counter)->reservList.append(reserv_pointer);
}
if(reader.name() == "place")
{
userList.at(user_counter)->reservList.at(reserv_counter)->placeList.append(reader.readElementText().toInt());
}
reader.readNextStartElement();
}
else
reader.readNext();
}
file.close();
}
는 바이너리 데이터 경우 작동하지 않습니다 아마도 여기에있는 것처럼 utf-8은 유효하지 않습니다. 나는 QString :: fromLatin1 (byteArray.toHex())를 사용할 것이다. toHex()의 대안은 toBase64()입니다. –
UTF8에 대해서는 /에서 테스트하지 않았으므로 Latin1에서는 제대로 작동하는 것으로 보입니다. 사실 XML 대신 이진 형식으로 시작하겠습니다. – dtech