Я загружаю двоичный файл в поток памяти, затем кодирую данные и возвращаю результат в виде строки, затем записываю результат в другой поток памяти и сохраняю его в файл, но когда он сохраняется, файл намного меньше оригинала 25 КБ из 400 КБ ... лол, я почти уверен, что это потому, что я достиг предела того, на что способна строка.
он определенно правильно кодирует, какие данные он сохраняет в новом файле, я расшифровал его и сравнил с началом исходного файла.
Я знаю, что это очень длинный метод и, вероятно, содержит некоторые ненужные шаги, поэтому загрузка его в bStream была бы очень эффективным решением. Мой вопрос заключается в том, как я могу вернуть данные в bStream, а не возвращать их в строку, а затем записывать строку в bStream в этот момент, поскольку я верю, что это решит мою проблему, любые другие предложения также будут оценены. Я использую Делфи 6.
Вот мой код:
function B64Encode(pInput: pointer; pOutput: pointer; Size: longint): longint;
var
i, iptr, optr: integer;
Input, Output: PByteArray;
begin
Input := PByteArray(pInput);
Output := PByteArray(pOutput);
iptr := 0;
optr := 0;
for i := 1 to (Size div 3) do
begin
Output^[optr + 0] := B64[Input^[iptr] shr 2];
Output^[optr + 1] := B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr + 1] shr 4)];
Output^[optr + 2] := B64[((Input^[iptr + 1] and 15) shl 2) + (Input^[iptr + 2] shr 6)];
Output^[optr + 3] := B64[Input^[iptr + 2] and 63];
Inc(optr, 4);
Inc(iptr, 3);
end;
case (Size mod 3) of
1:
begin
Output^[optr + 0] := B64[Input^[iptr] shr 2];
Output^[optr + 1] := B64[(Input^[iptr] and 3) shl 4];
Output^[optr + 2] := byte('=');
Output^[optr + 3] := byte('=');
end;
2:
begin
Output^[optr + 0] := B64[Input^[iptr] shr 2];
Output^[optr + 1] := B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr + 1] shr 4)];
Output^[optr + 2] := B64[(Input^[iptr + 1] and 15) shl 2];
Output^[optr + 3] := byte('=');
end;
end;
Result := ((Size + 2) div 3) * 4;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
aStream, bStream: TMemoryStream;
strastream: string;
szaStream: integer;
begin
bStream := TMemoryStream.Create;
aStream := TMemoryStream.Create;
aStream.LoadFromFile('C:\file1.exe');
szaStream := (astream.size + 2) div (3 * 4);
SetLength(strastream, szaStream);
B64Encode(astream.Memory, @strastream[1], Length(strastream));
bstream.WriteBuffer(strastream[1], szaStream);
AttachToFile('C:\file2.exe', bStream);
bstream.Free;
aStream.Free;
end;
Спасибо.
szaStream := (astream.size + 2) div (3 * 4);
точно проблема? вы делите на 12 по какой-то причине? - person Blorgbeard   schedule 15.08.2013((astream.size * 4) div 3) + 2)
- person Blorgbeard   schedule 15.08.2013