C++ 如何在写入文件之前对结构进行编码/加密
我有一个这样的结构:C++ 如何在写入文件之前对结构进行编码/加密,c++,C++,我有一个这样的结构: struct ITEM { INT ItemNum; BYTE Kind; char ItemName[200]; }; 我将项目结构写入到文件中,没有像这样编码,没有问题 ez_map<INT, ITEM>::iterator itrItem = mapItem.begin(); while (itrItem != mapItem.end()) { ITEM *pItem = &
struct ITEM
{
INT ItemNum;
BYTE Kind;
char ItemName[200];
};
我将项目结构写入到文件中,没有像这样编码,没有问题
ez_map<INT, ITEM>::iterator itrItem = mapItem.begin();
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
WriteFile(hFile, (LPCVOID)pItem, sizeof(ITEM), &dwBytesWritten, NULL);
}
ez_map::迭代器itrItem=mapItem.begin();
while(itrItem!=mapItem.end())
{
项目*pItem=&itrItem->秒;
WriteFile(hFile,(LPCVOID)pItem,sizeof(ITEM),&dwbytesswrited,NULL);
}
我尝试将结构强制转换为字节数组,然后对该数组进行编码并复制回结构,如下所示:
ez_map<INT, ITEM>::iterator itrItem = mapItem.begin();
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE bytesArr[sizeof(ITEM)];
memcpy(bytesArr, &pItem, sizeof(ITEM));
for(int i = 0; i < sizeof(ITEM); i++){
bytesArr[i] ^= 1;
}
memcpy(&pItem, bytesArr, sizeof(ITEM)); //crash here, because NULL character was xorred.
//end encode
WriteFile(hFile, (LPCVOID)pItem, sizeof(ITEM), &dwBytesWritten, NULL);
}
ez_map::迭代器itrItem=mapItem.begin();
while(itrItem!=mapItem.end())
{
项目*pItem=&itrItem->秒;
//开始编码
字节bytesArr[sizeof(ITEM)];
memcpy(bytesArr和pItem,尺寸(项目));
对于(int i=0;i
我还尝试使用CryptEncrypt,&pItem作为pbData,sizeof(ITEM)作为pdwDataLen,但没有成功。如果您能帮助我,谢谢。问题是第二个
memcpy()
上的&pItem
。您正在复制到错误的目标内存地址。应该是这样的:
memcpy(pItem, bytesArr, sizeof(ITEM));
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE* pb = (BYTE*)pItem;
int n = sizeof(ITEM);
do *pb++ ^= 1; while (--n);
//end encode
WriteFile(hFile, pItem, sizeof(ITEM), &dwBytesWritten, NULL);
// may be decode Item here if need
}
但是,不需要第二份额外副本。您可以使用如下代码:
memcpy(pItem, bytesArr, sizeof(ITEM));
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE* pb = (BYTE*)pItem;
int n = sizeof(ITEM);
do *pb++ ^= 1; while (--n);
//end encode
WriteFile(hFile, pItem, sizeof(ITEM), &dwBytesWritten, NULL);
// may be decode Item here if need
}
或者,如果pItem
必须为只读:
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE bytesArr[sizeof(ITEM)], *pc = bytesArr, *pb = (BYTE*)pItem;
int n = sizeof(ITEM);
do *pc++ = *pb++ ^ 1; while (--n);
//end encode
WriteFile(hFile, bytesArr, sizeof(ITEM), &dwBytesWritten, NULL);
}
问题在于第二个
memcpy()
上的&pItem
。您正在复制到错误的目标内存地址。应该是这样的:
memcpy(pItem, bytesArr, sizeof(ITEM));
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE* pb = (BYTE*)pItem;
int n = sizeof(ITEM);
do *pb++ ^= 1; while (--n);
//end encode
WriteFile(hFile, pItem, sizeof(ITEM), &dwBytesWritten, NULL);
// may be decode Item here if need
}
但是,不需要第二份额外副本。您可以使用如下代码:
memcpy(pItem, bytesArr, sizeof(ITEM));
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE* pb = (BYTE*)pItem;
int n = sizeof(ITEM);
do *pb++ ^= 1; while (--n);
//end encode
WriteFile(hFile, pItem, sizeof(ITEM), &dwBytesWritten, NULL);
// may be decode Item here if need
}
或者,如果pItem
必须为只读:
while (itrItem != mapItem.end())
{
ITEM *pItem = &itrItem->second;
//begin to encode
BYTE bytesArr[sizeof(ITEM)], *pc = bytesArr, *pb = (BYTE*)pItem;
int n = sizeof(ITEM);
do *pc++ = *pb++ ^ 1; while (--n);
//end encode
WriteFile(hFile, bytesArr, sizeof(ITEM), &dwBytesWritten, NULL);
}
您应该写入和读取字节数组,在写入之前进行编码,在读取之后进行解码。还请注意,通过将整数
ItemNum
作为字节序列进行访问,可以假定一个固定的endianness。您将无法在不同字节顺序的系统之间交换文件。没有理由将编码数据保存回ez\u映射中。只需将项目复制到字节数组,对字节数组进行编码,然后将字节数组写入文件。不要修改原始项目。读回文件时,只需将项目读入字节数组,对字节数组进行解码,然后根据需要将字节数组复制到ez_map
中。在两个memcpy调用中,您必须传递pItem
,而不是&pItem
。您应该写入和读取字节数组,在写入之前进行编码,在读取之后进行解码。还请注意,通过将整数ItemNum
作为字节序列进行访问,可以假定一个固定的endianness。您将无法在不同字节顺序的系统之间交换文件。没有理由将编码数据保存回ez\u映射中。只需将项目复制到字节数组,对字节数组进行编码,然后将字节数组写入文件。不要修改原始项目。读回文件时,只需将项目读入字节数组,解码字节数组,然后根据需要将字节数组复制到ez_映射中。在两个memcpy调用中,您必须传递pItem
,而不是&pItem
。