Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.01.2023, 06:26
svi2012 svi2012 вне форума
Прохожий
 
Регистрация: 15.09.2012
Сообщения: 7
Репутация: 10
По умолчанию Адаптация Java на Delphi

Всем привет. Помогите разобраться с таким вопросом.
Есть рабочая программа, написанная на Java. Она отправляет запрос на сервер и получает запакованные данные

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 12 Jan 2023 18:26:21 GMT
Connection: close
Content-Encoding: zip-block
Content-Length: 24640

D @xњіIО+¶іЙHML±іQЊvvq qЊV°
VИKМMµURRHN¶U26VІгІС
¶S€ЌµіС‡(OОЛ¶і V»& D @x

При обработке ответа TidCompressorZlib и не только получаю ошибку в неверном формате данных.

Я так понимаю, что при отправке происходит еще дополнительно шифрование или кодирование данных

Я вытянул два блока кода из программы на Java:
CompressedBlockInputStream
CompressedBlockOutputStream

Прошу знатоков о помощи в переносе кода с Java на Delphi
Вложения
Тип файла: txt CompressedBlockInputStream.txt (3.1 Кбайт, 5 просмотров)
Тип файла: txt CompressedBlockOutputStream.txt (2.3 Кбайт, 3 просмотров)
Ответить с цитированием
  #2  
Старый 18.01.2023, 19:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Судя по java коду, там первые 8 интов идут размеры входа и выхода.
Если не ошибаюсь, то int в java это 32 бита, т.е. 4 байта.
Попробуй от потока отрезать перыве 32 байта, а остаток подсунуть ZLib'у.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
svi2012 (18.01.2023)
  #3  
Старый 19.01.2023, 13:09
svi2012 svi2012 вне форума
Прохожий
 
Регистрация: 15.09.2012
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Судя по java коду, там первые 8 интов идут размеры входа и выхода.
Если не ошибаюсь, то int в java это 32 бита, т.е. 4 байта.
Попробуй от потока отрезать перыве 32 байта, а остаток подсунуть ZLib'у.

Делаю таким образом
IdHTTP.Get(TIdURI.URLEncode(URLString),DataZIP);

DataZIPTemp:=TStringStream.Create;
DataZIP.Seek(32, soFromBeginning);
DataZIPTemp.CopyFrom(DataZIP, DataZIP.Size-32);

DecompressionStream:=TZDecompressionStream.Create( DataZIPTemp);

Получаю EZDecompressionError - data error.
Ответить с цитированием
  #4  
Старый 20.01.2023, 16:32
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Цитата:
Сообщение от svi2012
получает запакованные данные

нужно либо после
Код:
IdHTTP.Get(TIdURI.URLEncode(URLString),DataZIP);
сделать
Код:
DataZIP.SaveToFile('test.bin');
и файл test.bin прикрепить сюда, либо дать ссылку которая в URLString.
Нужно глянуть на эти запакованные данные в исходном виде как они идут с сервера
Ответить с цитированием
  #5  
Старый 20.01.2023, 17:02
svi2012 svi2012 вне форума
Прохожий
 
Регистрация: 15.09.2012
Сообщения: 7
Репутация: 10
По умолчанию

Файл - test.bin
Сделать запрос из вне нет возможности. Связь с БД только внутри организации.

Request:
Connection: Close
User-Agent: Java/1.8.0_241
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

Responce:
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 20 Jan 2023 13:59:55 GMT
Connection: close
Content-Encoding: zip-block
Content-Length: 24640
Ответить с цитированием
  #6  
Старый 21.01.2023, 14:43
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Код:
procedure decompress;
var
  s_dec:TDecompressionStream;
  s_in,s_out:TMemoryStream;
const block=64;
      offset=8;
begin
  s_in:=TMemoryStream.Create;
  s_out:=TMemoryStream.Create;
  s_in.LoadFromFile('test.bin');
  repeat
    s_in.Position:=s_in.Position+offset;
    s_dec:=TDecompressionStream.Create(s_in);
    if s_in.Position+block<=s_in.Size then
      s_out.CopyFrom(s_dec,block)
    else
      s_out.CopyFrom(s_dec,s_in.Size-s_in.Position-offset);
    s_dec.Free;
  until s_in.Position>=s_in.Size;
  s_out.SaveToFile('decompress.bin');
  s_in.Free;
  s_out.Free;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Shaft за это полезное сообщение:
svi2012 (22.01.2023)
  #7  
Старый 22.01.2023, 05:03
svi2012 svi2012 вне форума
Прохожий
 
Регистрация: 15.09.2012
Сообщения: 7
Репутация: 10
По умолчанию

Спасибо за пример. Втянул процедуру в программу.
Но получаю ошибку
EDecompressionError - Invalid stream operation.
Ответить с цитированием
  #8  
Старый 22.01.2023, 17:49
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Ну тот файл test.bin декомпрессируется без ошибок (https://wdfiles.ru/b3ac899), значит сервер присылает разные варианты данных, этот код заточен только под те что были там. Надо как то по аналогии адаптировать.
Можно попробовать отправить несколько разных запросов если это возможно. И прикрепить сюда test1, 2, 3, .bin я посмотрю в чем может быть проблема

Последний раз редактировалось Shaft, 23.01.2023 в 14:53.
Ответить с цитированием
Этот пользователь сказал Спасибо Shaft за это полезное сообщение:
svi2012 (23.01.2023)
  #9  
Старый 23.01.2023, 19:19
svi2012 svi2012 вне форума
Прохожий
 
Регистрация: 15.09.2012
Сообщения: 7
Репутация: 10
Хорошо

Цитата:
Сообщение от Shaft
Ну тот файл test.bin декомпрессируется без ошибок (https://wdfiles.ru/b3ac899), значит сервер присылает разные варианты данных, этот код заточен только под те что были там. Надо как то по аналогии адаптировать.
Можно попробовать отправить несколько разных запросов если это возможно. И прикрепить сюда test1, 2, 3, .bin я посмотрю в чем может быть проблема

Я нашел ошибку на своей стороне в библиотеке Lib.
Ваш код на 100% работает !!!
Благодарю за Вашу помощь.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter