Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在写入文件之前对结构进行编码/加密_C++ - Fatal编程技术网

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