sarathbabununna Ответов: 4

Я хочу хранить данные cstring в двоичном формате (не в текстовом режиме, а в непонятном), но не могу их хранить


Мое требование состоит в том, чтобы хранить строковые данные в файле to .dat или .bin, который человек не может понять.

Я могу хранить целые числа в файле в двоичном режиме, но не могу хранить строку в двоичном режиме.

Я попробовал использовать CFile и CArchive в mFC
Попробовал использовать fstream
Пробовал использовать файл*
Но не удалось.

Может ли кто-нибудь помочь мне в этом?

Что я уже пробовал:

void CAuthenticationFileDlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	static int count =0;
	DisplayKeys(count);
	
	CString strTotalKeys = m_keys->GetKey1() + m_keys->GetKey2() + m_keys->GetKey3() + m_keys->GetKey4();
	m_vectKeys.push_back(strTotalKeys);
	
	m_EditKey1.SetFocus();
	CFile pFile;
	ASSERT (pFile != NULL);
	if (!pFile.Open (_T("foo.dat"), CFile::modeReadWrite | CFile::modeCreate|CFile::typeBinary))
	{    // Handle error
    return;
	}
	CArchive arStore(&pFile, CArchive::store);
	Serialize(arStore);
	
	delete m_keys;
	count++;
	
	if(count>0)
	{
		m_keys = new CKeys;
	}

	UpdateData(FALSE);
}



void CAuthenticationFileDlg::Serialize(CArchive &ar)
{
	if (ar.IsStoring())
	{
		 // Write the object to the archive
		ar.WriteObject(m_keys);
		ar.Close();
   }
    else 
    {
		// Verify the object is in the archive.
		CKeys* pKey = (CKeys*) ar.ReadObject(RUNTIME_CLASS(CKeys));
		m_keys = pKey;
		CString strTotalKeys = m_keys->GetKey1() + m_keys->GetKey2() + m_keys->GetKey3() + m_keys->GetKey4();
		m_vectKeys.push_back(strTotalKeys);
			DisplayKeys();
	}   
}

4 Ответов

Рейтинг:
2

Richard MacCutchan

Двоичного режима не существует, поскольку все данные можно считать двоичными. Если вы хотите надежно хранить читаемые данные, вам нужно их зашифровать. Google найдет вам множество образцов, которые помогут вам.


CPallini

5.

Рейтинг:
2

Jochen Arndt

То CArchive:: WriteObject[^] функция вызовет Serialize функция-член переданного объекта. Поэтому при использовании

ar.WriteObject(m_keys);
вы должны реализовать Serialize для вашего CKeys класс.

Предполагая, что GetKeyN функции возвращаются CString объекты, на которые это может быть похоже
void CKeys::Serialize(CArchive& ar)
{
    CObject::Serialize(ar);
    if (ar.IsStoring())
    {
        ar.WriteString(GetKey1());
        ar.WriteString(GetKey2());
        ar.WriteString(GetKey3());
    }
    else
    {
        CString strBuf;
        ar.ReadString(strBuf);
        CString strTotalKeys = strBuf;
        // Set Key1 from strBuf here. If you have a SetKey1() function:
        //SetKey1(strBuf);

        // Repeat for keys 2 and 3
        ar.ReadString(strBuf);
        strTotalKeys += strBuf;
        //SetKey2(strBuf);

        ar.ReadString(strBuf);
        strTotalKeys += strBuf;
        //SetKey3(strBuf);
    }
}


[РЕДАКТИРОВАТЬ]
Если вы хотите, чтобы он был нечитаемым, используйте какой-то метод шифрования при хранении и соответствующую расшифровку при загрузке.
[/РЕДАКТИРОВАТЬ]


Рейтинг:
1

CPallini

Единственное решение-это шифрование: для строк, а также для целых чисел (и изображений). Смотрите, например: Шифрование данных в MSDN[^].


Рейтинг:
0

Patrice T

Цитата:
Я хочу хранить данные cstring в двоичном формате (не в текстовом режиме, а в непонятном), но не могу их хранить

Ваша проблема в том, что что касается cstrings, то двоичный режим - это текстовый режим!
Поэтому то, что вы хотите сделать, не существует.