Помогите разобраться: Строка в кодировке Base64

Игорь_UUS
Дата: 15.07.2019 11:28:07
Добрый день.

Смысл такой, нужно бинарные данные отправить в виде строки в MSSQL.

Вроде как есть момент в дельфях: System.NetEncoding.TBase64Encoding

но как это работает не могу разобраться... помогите (подскажите) строчкой кода, как правильно это должно работать
Valery_B
Дата: 15.07.2019 11:35:46
Игорь_UUS,

procedure TForm1.Button1Click(Sender: TObject);
var
 InputStream:TMemoryStream;
 OutputStream:TStringStream;
begin
 InputStream:=TMemoryStream.Create;
  try
   InputStream.LoadFromFile('C:\File.jpg');
    OutputStream:=TStringStream.Create;
     try
      TNetEncoding.Base64.Encode(InputStream, OutputStream);
      ShowMessage(OutputStream.DataString);

     finally
      OutputStream.Free;
     end;
  finally
    InputStream.Free;
  end;
end;
Игорь_UUS
Дата: 15.07.2019 16:56:59
Valery_B
Игорь_UUS,

procedure TForm1.Button1Click(Sender: TObject);
var
 InputStream:TMemoryStream;
 OutputStream:TStringStream;
begin
 InputStream:=TMemoryStream.Create;
  try
   InputStream.LoadFromFile('C:\File.jpg');
    OutputStream:=TStringStream.Create;
     try
      TNetEncoding.Base64.Encode(InputStream, OutputStream);
      ShowMessage(OutputStream.DataString);

     finally
      OutputStream.Free;
     end;
  finally
    InputStream.Free;
  end;
end;


Спасибо... код рабочий, но в итоге сохраняет что-то не то...

сейчас у меня код такой:

function TSchedulerFrm.GetResourcesJSONArr: string;
  var JSONArr     : TJSONArray;
      JSONObj     : TJSONObject;
      InputStream :TMemoryStream;
      OutputStream:TStringStream;
begin
  JSONArr := TJSONArray.Create;
  try
    FResourceCacheEdit.First;
    while not FResourceCacheEdit.Eof do
    begin
      if FResourceCacheEdit.Edited = True then
      begin
        JSONObj := TJSONObject.Create;
       ..
       ..
        

        if not FResourceCacheEdit.MSEV1Miniature.isNULL then
        begin
          InputStream := TMemoryStream.Create;
          try
            FResourceCacheEdit.MSEV1Miniature.SaveToStream(InputStream);
            InputStream.Position := 0;

            OutputStream := TStringStream.Create;
            try
              TNetEncoding.Base64.Encode(InputStream, OutputStream);
              JSONObj.AddPair(TJSONPair.Create(fnSCH_MSEV1Miniature,      OutputStream.DataString));
            finally
              OutputStream.Free;
            end;
          finally
            InputStream.Free;
          end;
        end;

        // Сохраняем объект в массив.
        JSONArr.AddElement(JSONObj);
      end;

      FResourceCacheEdit.Next;
    end;

    Result := JSONArr.ToString;
  finally
    JSONArr.Free;
  end;
end;



Исходный файл имеет размер 11556, то что сохраняется в БД имеет больший размер 11859. При этом если посмотреть "поток" данных, то в самом начале он идентичен, к середине потока появляется "какой-то мусор"... но самое интересное файл заканчивается тем же потоком что и исходный.

То что отправил в MSSQL читаю след. образом:
Игорь_UUS
Дата: 15.07.2019 17:00:58
 SELECT
	  [MSEV1Miniature]
 FROM OPENJSON(@ResourcesJSONArr) WITH (
      
      [MSEV1Miniature]				VARBINARY(MAX)	'$.MSEV1Miniature'
    )


Читая справку mssql: Двоичные типы такие как "varbinary, binary, image, timestamp, rowversion" должны храниться как строка в кодировке Base64. Вроде как всё правильно, но что-то идёт не так... помогите разобраться уже голову сломал((
rgreat
Дата: 15.07.2019 17:33:50
Я бы советовал пользоваться IdCoderMIME.TIdEncoderMIME.

Он кроссплатформенный в отличие от System.NetEncoding.
Zelius
Дата: 15.07.2019 18:58:50
Игорь_UUS,

а Delphi какая версия?
Попробуй так
 JSONObj.AddPair(TJSONPair.Create(fnSCH_MSEV1Miniature, EncodeBytesToString(FResourceCacheEdit.MSEV1Miniature.AsBytes)));

Попробуй закодировать текст и раскодировать его online декодером. и на что ругается mssql?
Zelius
Дата: 15.07.2019 18:59:29
TNetEncoding.Base64.EncodeBytesToString конечно
Gator
Дата: 15.07.2019 21:49:13
Игорь_UUS
Двоичные типы такие как "varbinary, binary, image, timestamp, rowversion" должны храниться как строка в кодировке Base64
Нет там такого.
Читай про типы данных и XML
https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-2017
https://docs.microsoft.com/ru-ru/sql/relational-databases/xml/use-the-binary-base64-option?view=sql-server-2017
Василий 2
Дата: 16.07.2019 10:01:43
rgreat
Он кроссплатформенный в отличие от System.NetEncoding.

а в каком месте System.NetEncoding не кросс-платформа?