Plik .ico do stringa

0

Czy widzicie jakieś zagrożenie w takiej konwersji:

{ w array bajty małej ikony 256 bajtów chodzi o plik językowy więc jest to flaga przełączająca język. W pozostałych wierszach bazy umieszczone są komunikaty i opisy itd..dlatego stringi. }
// pętla:
S:=s+chr(array[x]);{ zapisanie ikony w wierszu prostej bazy
I odwrócenie przez:}
//Pętla:
Array[x]:=s[x];{ odtworzenie pliku ikony w katalogu, czuję coś nosem że kodowanie znaków może coś mi przekręcić…}
0

Tak, zagrożenie bezmyślnego stukania w klawiaturę, bezmyślnego zadawania pytań, bezmyślnego trollowania.
Czym jest s?
Czym jest array, czy rozumiesz że to słowo kluczowe?
Czym jest Aray, czemu po pętli nie napisać zwyczajnie: Aray:=s;?

0

@Windowbee:
domyślam się masz na myśli jakiś dwukierunkowy sposób konwersji danych binarnych na stringa ??

0

@grzegorz_so:
Tak dokładnie pominąłem całe dwie funkcje kodu bo po co zaśmiecać … w nawiasach podałem opis, widocznie nie dość zrozumiale.

Nie wiem w jaki sposób bardziej skrótowy napisać że planuję przenieść bajty z pliku ico do znaków w stringu.
Pokazałem tylko pojedynczy krok w pętli plik—> string
I odwrotnie string —> plik

Nie pokazywałem już przecież przenoszenia tablicy bajtów do pliku ani z pliku do array.

Pisanie całej funkcji zaśmieci ekran. Więc uznałem że wrzucę skrót myślowy.

Wiem jak to zrobić nie znam tylko zasad kodowania znaków , czy nie wystąpi wyjątek że bajtowi nie odpowiada znak albo jest specjalny i też będzie problem.
Ten string ma
Przenosić informację tylko, nie będzie wyświetlany.
Mam proste bazy danych o podobnym schemacie jak pliki csv(wiersze stringów, komórki oddzielone separatorem) i w jednym miejscu chcę umieszczać ikonę, żeby jako string na zapytanie klienta przesłać ją przez port.
Żeby bałaganu nie było nie chcę tworzyć dodatkowych ikon w katalogu wersji językowych.

1
function getBytesFromFileAsAnsistring(aFilename: string): ansistring;
var
  ms: TMemorystream;
begin
  result:='';
  ms := TMemorystream.Create;
  try
    ms.LoadFromFile(aFilename);
    setlength(result, ms.Size);
    ms.Read(result[1], ms.Size);
  finally
    ms.free;
  end;

end;

to jeden z wielu sposobów na rozwiązanie Twojego problemu

2

Otwierasz połączenie jako strumień, przeważnie w IOHandler, otwierasz plik i jednym poleceniem:
https://docwiki.embarcadero.com/RADStudio/Sydney/en/Copying_Data_From_One_Stream_To_Another

Dla umieszczenia w pliku tekstowym:
EncodeBase64
DecodeBase64
działające wprost na strumieniu.

1

Witam.

procedure TForm6.Button2Click(Sender: TObject);
var FStream : TStream;
var txt : String;
var MStream: TMemoryStream;

function MemoryStreamToString(M: TMemoryStream): AnsiString;
begin
  SetString(Result, PAnsiChar(M.Memory), M.Size);
end;

begin
     MStream := TMemoryStream.Create;
     FStream := TFileStream.Create('mail.ico', fmOpenRead);
     try
         MStream.CopyFrom( FStream,  FStream.Size );
         txt := string(MemoryStreamToString( MStream ));
     finally
         FStream.Free;
         MStream.Free;
     end;
end;

@Windowbee, w zmiennej txt masz ikonę

2

@dasej: skoro używasz strumieni, to dlaczego nie TStringStream? ;)

var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create();
  try
    Stream.LoadFromFile('mail.ico');

    // "Stream.DataString" zwraca ciąg znaków.
  finally
    Stream.Free();
  end;
end;

Tyle tylko, że taki ciąg znaków będzie zawierał dokładnie to co plik ikony, czyli najróżniejsze znaki, w tym te kontrolne, nulle i inne badziewie. IMO lepszym rozwiązaniem będzie sugerowany wcześniej Base64, bo to przynajmniej będzie jak ciąg znaków wyglądało.

1 użytkowników online, w tym zalogowanych: 0, gości: 1