0
我正在使用RNCryptor加密文件和大型文件我使用NSInputStream將文件分割成塊和編碼/解碼這些塊。它工作得很好,直到我需要base64編碼/解碼傳遞給流的塊。使用base64編碼與NSInputStream
下面的代碼工作的編碼完全沒有問題,但它不會做base64編碼:
NSInputStream *tmpStream = [[NSInputStream alloc] initWithURL:fileURL];
NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
[tmpStream open];
[outputStream open];
__block NSMutableData *data = [NSMutableData dataWithLength:kBlockSize];
__block RNEncryptor *encryptor = nil;
dispatch_block_t readStreamBlock = ^{
[data setLength:kBlockSize];
NSInteger bytesRead = [tmpStream read:[data mutableBytes] maxLength:kBlockSize];
if (bytesRead < 0) {
NSLog(@"An error occurred while decrypting file stream");
if (resultBlock) { resultBlock(nil); }
return;
}
else if (bytesRead == 0){
[encryptor finish];
}
else {
[data setLength:bytesRead];
[encryptor addData:data];
}
};
encryptor = [[RNEncryptor alloc] initWithSettings:kRNCryptorAES256Settings
password:HUCryptorPassword
handler:^(RNCryptor *cryptor, NSData *data) {
[outputStream write:data.bytes maxLength:data.length];
if(cryptor.isFinished){
[outputStream close];
if (resultBlock) {
resultBlock([NSString stringWithFormat:@"%@", filePath]);
}
}
else {
readStreamBlock();
}
}];
readStreamBlock();
我嘗試添加base64編碼數據被加密後寫入到輸出流之前:
NSData *base64Data = [data base64EncodedDataWithOptions:kNilOptions]; //Tried with all options
[outputStream write:base64Data.bytes maxLength:base64Data.length];
但是,這給了我輸出文件不正確的結果。
只有正確的方法,我得到正確的編碼/解碼數據是加載整個文件在內存中,並調用編碼/解碼方法。
NSData *resultData = [NSData dataWithContentsOfFile:filePath]; //This is location of output file stream
NSData *encodedData = [resultData base64EncodedDataWithOptions:kNilOptions]; //Gives me correct base64 encoded data
我想避免,因爲我需要編碼/解碼大文件,如視頻,聲音和圖像。
是否有任何安全的方法來實現這一目標?
謝謝!我決定將數據編碼爲HEX格式,因爲此時處理base64更簡單。 –