powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите разобраться: Строка в кодировке Base64
29 сообщений из 29, показаны все 2 страниц
Помогите разобраться: Строка в кодировке Base64
    #39837368
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

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

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

но как это работает не могу разобраться... помогите (подскажите) строчкой кода, как правильно это должно работать
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837375
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;
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837548
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите разобраться: Строка в кодировке Base64
    #39837550
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Помогите разобраться: Строка в кодировке Base64
    #39837561
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы советовал пользоваться IdCoderMIME.TIdEncoderMIME.

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

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


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

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


Сделай рефакторинг своего "кода" на методы из не более чем 3-5 строк.
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837774
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!
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837814
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2rgreatОн кроссплатформенный в отличие от System.NetEncoding.
а в каком месте System.NetEncoding не кросс-платформа?Там нельзя кодировку текста выставить. И под линуксом там по умолчанию идет utf8.
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837894
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите разобраться: Строка в кодировке Base64
    #39837900
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я несколько не врубился.

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

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

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

Чем отличается формат json от форматов zip, jpeg, pdf?
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837928
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён, кстати, я так делаю изменения софта реплицирую базой
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39837939
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_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
Помогите разобраться: Строка в кодировке Base64
    #39837981
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSзачем тогда base64?
Base64 увеличивает размер на 3/4, а хексы ровно в 2 раза.
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838003
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВасилий 2пропущено...

а в каком месте System.NetEncoding не кросс-платформа?Там нельзя кодировку текста выставить. И под линуксом там по умолчанию идет utf8.
Да и правильно, для целей коммуникации все кодировки помимо utf8 должны умереть. Но для особых любитетей никто не мешает засунуть RawByteString
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838042
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Да и правильно, для целей коммуникации все кодировки помимо utf8 должны умереть. Но для особых любитетей никто не мешает засунуть RawByteStringАга, но проблема в том что на вход функции там идет String UTF16 а в кишках ее обрабатывают как поток UTF8. ;)
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838044
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты конечно можешь попробовать попытаться запихать в дельфовый стринк байты в формате UTF8,
но такой секс на ветру с дефайнами и хаками памяти - это без меня.
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838054
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BИгорь_UUSзачем тогда base64?
Base64 увеличивает размер на 3/4, а хексы ровно в 2 раза.
Вообще-то base64 на 1/3 увеличивает: 3 => 4.
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838055
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatАга, но проблема в том что на вход функции там идет String UTF16 а в кишках ее обрабатывают как поток UTF8. ;)
На вход там можно TBytes передать, от кодировки вообще не зависит.
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838204
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GatorИгорь_UUS, на вскидку

https://olontsev.ru/2013/06/convert-to-base64-and-back/

https://docs.microsoft.com/en-us/sql/relational-databases/xml/use-the-binary-base64-option?view=sql-server-2017
https://medium.com/falafel-software/t-sql-easy-base64-encoding-and-decoding-872ad184bd7e

https://stackoverflow.com/questions/32243815/sql-server-base64-encoding-stored-function
https://dba.stackexchange.com/questions/191273/decode-base64-string-natively-in-sql-server


Всё перепробовал... то что кодирую в дельфях не получается раскодировать в MSSQL... при раскодировки вообще непонятно что получается.

Если открыть таблицу через менеджмент студию, то начала файла выглядит так:

0xFFD8FFE000104A46494600010100000100010000FFDB0043000302020302020303030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12


то что кодирую в дельфях, получаю вот:

0xFFD8FFE000104A46494600010100000100010000FFDB0043000302020302020303030304030304050805050404050A070706080C0A0C0C0B0AAE70B0B0D0

т.е. начало потока одинаковое...
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838210
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatАга, но проблема в том что на вход функции там идет String UTF16 а в кишках ее обрабатывают как поток UTF8. ;)
По-прежнему не понимаю, в чем проблема. Под Линуксом string не UTF16?
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838220
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй вручную создавать с параметрами:
Код: pascal
1.
TBase64Encoding.Create(-1, '')
...
Рейтинг: 0 / 0
Помогите разобраться: Строка в кодировке Base64
    #39838263
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievПопробуй вручную создавать с параметрами:
Код: pascal
1.
TBase64Encoding.Create(-1, '')



ОГРОМНОЕ СПАСИБО!

Разобрался и в причинах и в следствиях! "Мусор" был в символе переноса строк, который идёт как параметр по умолчанию, скул на устранение данного переноса попросту не предусмотрен!
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите разобраться: Строка в кодировке Base64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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