我有这样的结构:
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,但没有运气。
谢谢你,如果你可以帮助我。
答案 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);
}