Сначала позвольте мне ответить на ваш первоначальный вопрос
Как преобразовать поток в base16 и обратно (он же ASCII-HEX).
Ваш код для преобразования в base16 здесь правильныйявляется по существу равной версией:
function StreamToHexStr(const AStream: TStream): String;
const
cMap : array[0..15] of Char = (
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F');
var
lData: Byte;
lPos: Integer;
begin
Setlength(Result, AStream.Size * 2);
AStream.Position := 0;
lPos := Low(Result);
while AStream.ReadData(lData) = sizeof(lData) do begin
Result[lPos] := cMap[lData shr 4];
Result[lPos + 1] := cMap[lData and $0F];
Inc(lPos, 2);
end;
end;
Чтобы преобразовать строку обратно в поток, попробуйте следующее:
procedure HexStrToStream(const AString: String; AStream: TStream);
const
// Mapping vom ASCII-Code to value
cMap: array['0'..'F'] of Byte = (
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // $30..$39 / '0'..'9'
100, 100, 100, 100, 100, 100, 100, // $3A..$40
10, 11, 12, 13, 14, 15); // $41..$46 / 'A'..'F'
var
lPos: Integer;
begin
lPos := Low(AString);
while lPos < High(AString) do begin
AStream.WriteData(UInt8(cMap[AString[lPos]] shl 4 + cMap[AString[lPos + 1]]));
Inc(lPos, 2);
end;
end;
Чтобы использовать этот код, просто выполните:
Base16String := StreamToHexStr(MP3Stream);
на отправителе и на получателе выполните:
lRecvStream := TMemoryStream.Create();
try
HexStrToStream(Base16RecvString, RecvStream);
lRecvStream.SaveToFile('Record.mp3');
finally
lRecvStream.Free();
end;
Как сделать то же самое для base64
С TMemoryStream на стороне отправителя вы просто делаете:
lString := TNetEncoding.Base64.EncodeBytesToString(lInStream.Memory, lInStream.Size);
и на принимающей стороне вы используете TBytesStream (который является потомком TMemoryStream):
lRecvStream := TBytesStream.Create(TNetEncoding.Base64.DecodeStringToBytes(lString));
try
lRecvStream.SaveToFile('Record.mp3');
finally
lRecvStream.Free();
end;
Вещи, которые вы можете учитывать
Во время передачи данных некоторые байтыможет быть изменен или потерятьсяИногда целые пакеты не будут получены.В зависимости от ваших требований вашему приложению может потребоваться защита от таких ошибок.