Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите разобраться: Строка в кодировке Base64 / 25 сообщений из 29, страница 1 из 2
15.07.2019, 11:28
    #39837368
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Добрый день.

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

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

но как это работает не могу разобраться... помогите (подскажите) строчкой кода, как правильно это должно работать
...
Рейтинг: 0 / 0
15.07.2019, 11:35
    #39837375
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_UUS,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;
...
Рейтинг: 0 / 0
15.07.2019, 16:56
    #39837548
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Valery_BИгорь_UUS,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;



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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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 читаю след. образом:
...
Рейтинг: 0 / 0
15.07.2019, 17:00
    #39837550
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Код: sql
1.
2.
3.
4.
5.
6.
 SELECT
	  [MSEV1Miniature]
 FROM OPENJSON(@ResourcesJSONArr) WITH (
      
      [MSEV1Miniature]				VARBINARY(MAX)	'$.MSEV1Miniature'
    )



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

Он кроссплатформенный в отличие от System.NetEncoding.
...
Рейтинг: 0 / 0
15.07.2019, 18:58
    #39837606
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_UUS,

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


Попробуй закодировать текст и раскодировать его online декодером. и на что ругается mssql?
...
Рейтинг: 0 / 0
15.07.2019, 18:59
    #39837607
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
TNetEncoding.Base64.EncodeBytesToString конечно
...
Рейтинг: 0 / 0
15.07.2019, 21:40
    #39837628
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
...
Рейтинг: 0 / 0
15.07.2019, 21:49
    #39837629
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_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
...
Рейтинг: 0 / 0
16.07.2019, 10:01
    #39837736
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
rgreatОн кроссплатформенный в отличие от System.NetEncoding.
а в каком месте System.NetEncoding не кросс-платформа?
...
Рейтинг: 0 / 0
16.07.2019, 10:53
    #39837757
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_UUSпомогите разобраться уже голову сломал((

Разберись, что ты хочешь - работать с Json, БД, полем или ещё чем.
Если ты хочешь,
1. Преобразовать поток в Base64 - я сделал пример.
2. Работать с полем VARBINARY(MAX) - то тебе надо преобразовать строку Base64 в VARBINARY.
3. У поля VARBINARY есть метод .Write - работай с ним
4. То создай сторед процедуру, с параметром @Data VARBINARY(MAX) и создавай параметр с соответствующим типом.


Сделай рефакторинг своего "кода" на методы из не более чем 3-5 строк.
...
Рейтинг: 0 / 0
16.07.2019, 11:15
    #39837774
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
У меня всё работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE @Json VARCHAR(MAX) = 
'[
    {
        "ID": 1,
        "Data": "SGVsbG8gd29ybGQh"
    }
 ]'
 
SELECT ID, [Data], CONVERT(VARCHAR(MAX), [Data]) as EncodedText
  
 FROM OPENJSON(@Json)
 WITH
  (
   ID int,
   [Data] VARBINARY(MAX)
  )



авторID Data EncodedText
1 0x48656C6C6F20776F726C6421 Hello world!
...
Рейтинг: 0 / 0
16.07.2019, 12:07
    #39837814
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Василий 2rgreatОн кроссплатформенный в отличие от System.NetEncoding.
а в каком месте System.NetEncoding не кросс-платформа?Там нельзя кодировку текста выставить. И под линуксом там по умолчанию идет utf8.
...
Рейтинг: 0 / 0
16.07.2019, 14:37
    #39837894
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Valery_BУ меня всё работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE @Json VARCHAR(MAX) = 
'[
    {
        "ID": 1,
        "Data": "SGVsbG8gd29ybGQh"
    }
 ]'
 
SELECT ID, [Data], CONVERT(VARCHAR(MAX), [Data]) as EncodedText
  
 FROM OPENJSON(@Json)
 WITH
  (
   ID int,
   [Data] VARBINARY(MAX)
  )



авторID Data EncodedText
1 0x48656C6C6F20776F726C6421 Hello world!


Спасибо за намёк... зачем тогда base64? может поискать как передавать параметр в виде бинарной строки в HEX формате? т.е. поток данных не перекодировать в base64 а перевести его в текст и "засунуть" в json... я вот думаю, зачем мне передавать в base64 если в mssql мне нужно будет перекодировать base64 в "нормальный" бинарник.. или я что-то не догоняю
...
Рейтинг: 0 / 0
16.07.2019, 14:44
    #39837900
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Я несколько не врубился.

В MSSQL есть возможность в таблице создать поле для хранения бинарных данных (JPEG, например, или там PDF или ZIP, не важно): например VARBINARY(MAX)
И если программа-клиент написана на Delphi, то имеющиеся компоненты доступа позволяют получить это поле в виде TBLOBField со всеми вытекающими удобствами записи/чтения.
...
Рейтинг: 0 / 0
16.07.2019, 15:14
    #39837914
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Кроик СемёнЯ несколько не врубился.

В MSSQL есть возможность в таблице создать поле для хранения бинарных данных (JPEG, например, или там PDF или ZIP, не важно): например VARBINARY(MAX)
И если программа-клиент написана на Delphi, то имеющиеся компоненты доступа позволяют получить это поле в виде TBLOBField со всеми вытекающими удобствами записи/чтения.

всё бы ничего, но нужно передать данные в формате json
...
Рейтинг: 0 / 0
16.07.2019, 15:29
    #39837925
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_UUS,

Чем отличается формат json от форматов zip, jpeg, pdf?
...
Рейтинг: 0 / 0
16.07.2019, 15:33
    #39837928
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Кроик Семён, кстати, я так делаю изменения софта реплицирую базой
...
Рейтинг: 0 / 0
16.07.2019, 15:54
    #39837939
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_UUSвсё бы ничего, но нужно передать данные в формате json

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
procedure WriteTextInStream(const AText: string; AStream: TStream);
var
   pText    : PChar;
begin
   pText:=PChar(AText);
   AStream.Write(pText^,Length(AText));
end;
--------------------------------------------------------------------------------
var
   QTable      : TMSQuery;
   fld         : TField;
   fldBLOB     : TBLOBField;
   JSONArr     : TJSONArray;
   mem         : TMemoryStream;
begin
   ...
   ...
   fld := QTable.FieldByName(....);
   
   
   QTable.Append();
   ...
   if fld is TBLOBField then
   begin
      fldBLOB := TBLOBField(fld);
     
     
      mem := TMemoryStream.Create();
      try
         WriteTextInStream(JSONArr.ToString, mem);
       
         mem.Position := 0;
         fldBLOB.LoadFromStream(mem);
      finally
         FreeAndNil(mem);
      end;     
   end;
   
   QTable.Post();
...
Рейтинг: 0 / 0
16.07.2019, 17:17
    #39837981
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Игорь_UUSзачем тогда base64?
Base64 увеличивает размер на 3/4, а хексы ровно в 2 раза.
...
Рейтинг: 0 / 0
16.07.2019, 17:49
    #39838003
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
rgreatВасилий 2пропущено...

а в каком месте System.NetEncoding не кросс-платформа?Там нельзя кодировку текста выставить. И под линуксом там по умолчанию идет utf8.
Да и правильно, для целей коммуникации все кодировки помимо utf8 должны умереть. Но для особых любитетей никто не мешает засунуть RawByteString
...
Рейтинг: 0 / 0
16.07.2019, 19:23
    #39838042
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Василий 2Да и правильно, для целей коммуникации все кодировки помимо utf8 должны умереть. Но для особых любитетей никто не мешает засунуть RawByteStringАга, но проблема в том что на вход функции там идет String UTF16 а в кишках ее обрабатывают как поток UTF8. ;)
...
Рейтинг: 0 / 0
16.07.2019, 19:24
    #39838044
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Ты конечно можешь попробовать попытаться запихать в дельфовый стринк байты в формате UTF8,
но такой секс на ветру с дефайнами и хаками памяти - это без меня.
...
Рейтинг: 0 / 0
16.07.2019, 19:58
    #39838054
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
Valery_BИгорь_UUSзачем тогда base64?
Base64 увеличивает размер на 3/4, а хексы ровно в 2 раза.
Вообще-то base64 на 1/3 увеличивает: 3 => 4.
...
Рейтинг: 0 / 0
16.07.2019, 20:00
    #39838055
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться: Строка в кодировке Base64
rgreatАга, но проблема в том что на вход функции там идет String UTF16 а в кишках ее обрабатывают как поток UTF8. ;)
На вход там можно TBytes передать, от кодировки вообще не зависит.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите разобраться: Строка в кодировке Base64 / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]