Мы будем, если Вы будете думать об этом, как Вы предлагаете, чтобы Вы нашли количество строк в файле, не читая целый файл для новых строк? Несомненно, можно найти размер файла, и если Вы можете gurantee, что длина строки является x, можно получить количество строк в файле. Но если у Вас нет некоторого ограничения, мне не удается видеть, как это может работать вообще. Кроме того, так как iterables может быть бесконечно длинным...
Было бы полезно, если бы вы могли опубликовать свой C ++ и свой код C #. Возможно, есть небольшие различия в параметрах или что-то в этом роде. Например, вы должны убедиться, что параметр pOptionalEntropy такой же (или установить для него значение NULL, чтобы проверить, является ли это источником ошибки). Кроме того, не забудьте попытаться зашифровать и расшифровать на том же ПК:
[...] дешифрование обычно может быть выполнено только на компьютер, на котором были данные encrypted
(Источник: MSDN )
РЕДАКТИРОВАТЬ: Некоторые комментарии к опубликованному вами коду и версии C # из MSDN (его части ниже):
public byte[] Encrypt(byte[] plainText, byte[] optionalEntropy) {
[...]
int bytesSize = plainText.Length;
plainTextBlob.pbData = Marshal.AllocHGlobal(bytesSize);
plainTextBlob.cbData = bytesSize;
Marshal.Copy(plainText, 0, plainTextBlob.pbData, bytesSize);
[...]
dwFlags = CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN;
[...]
if(null == optionalEntropy)
{//Allocate something
optionalEntropy = new byte[0]; // Is copied to entropyBlob later
}
[...]
retVal = CryptProtectData(ref plainTextBlob, "", ref entropyBlob,
IntPtr.Zero, ref prompt, dwFlags,
ref cipherTextBlob);
[...]
}
И еще раз ваш код C ++, чтобы имейте в виду и то, и другое:
[...]
BYTE *pbDataInput =(BYTE *)(char*)value.c_str();
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
[...]
CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut))
Параметры не совпадают, и я думаю, что это источник различий.
Первое - это флаги. В коде C # используется dwFlags! = 0, в вашем коде на C ++ dwFlags = 0, так что это очевидная разница.
Я не уверен в энтропии. Если вы не передали optionalEntropy = null, это разница, но если оно равно null, есть назначение «новый байт [0]», и я не уверен, что это создаст, но я думаю, вам следует хотя бы попробовать передать IntPtr.Zero вместо entropyBlob в CryptProtectData для сопоставления с кодом C ++.
И последнее, но не менее важное: