如何在写入文件之前对结构进行编码/加密

时间:2016-11-09 07:36:37

标签: c++

我有这样的结构:

struct ITEM
{
    INT         ItemNum;
    BYTE        Kind;
    char        ItemName[200];
};

我将ITEM结构写入文件而没有像这样的编码,没问题。

ez_map<INT, ITEM>::iterator itrItem = mapItem.begin();
while (itrItem != mapItem.end())
{
   ITEM *pItem = &itrItem->second;
   WriteFile(hFile, (LPCVOID)pItem, sizeof(ITEM), &dwBytesWritten, NULL);
}

我尝试将结构转换为byte数组,然后对此数组进行编码并将其复制回struct:

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);
}

我也尝试使用CryptEncrypt,&amp; pItem作为pbData,sizeof(ITEM)作为pdwDataLen,但没有运气。
谢谢你,如果你可以帮助我。

1 个答案:

答案 0 :(得分:2)

问题是第二个&pItem上的memcpy()。您正在复制到错误的目标内存地址。它需要像这样:

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);
}