|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Адаптация 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ЊvvqqЊV° VИKМMµURRHN¶U26VІгІС ¶S€ЌµіС‡(OОЛ¶і V»& D @x При обработке ответа TidCompressorZlib и не только получаю ошибку в неверном формате данных. Я так понимаю, что при отправке происходит еще дополнительно шифрование или кодирование данных Я вытянул два блока кода из программы на Java: CompressedBlockInputStream CompressedBlockOutputStream Прошу знатоков о помощи в переносе кода с Java на Delphi |
#2
|
|||
|
|||
Судя по java коду, там первые 8 интов идут размеры входа и выхода.
Если не ошибаюсь, то int в java это 32 бита, т.е. 4 байта. Попробуй от потока отрезать перыве 32 байта, а остаток подсунуть ZLib'у. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
svi2012 (18.01.2023)
|
#3
|
|||
|
|||
Цитата:
Делаю таким образом 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
|
|||
|
|||
Цитата:
нужно либо после Код:
IdHTTP.Get(TIdURI.URLEncode(URLString),DataZIP); Код:
DataZIP.SaveToFile('test.bin'); Нужно глянуть на эти запакованные данные в исходном виде как они идут с сервера |
#5
|
|||
|
|||
Файл - 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
|
|||
|
|||
Код:
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
|
|||
|
|||
Спасибо за пример. Втянул процедуру в программу.
Но получаю ошибку EDecompressionError - Invalid stream operation. |
#8
|
|||
|
|||
Ну тот файл test.bin декомпрессируется без ошибок (https://wdfiles.ru/b3ac899), значит сервер присылает разные варианты данных, этот код заточен только под те что были там. Надо как то по аналогии адаптировать.
Можно попробовать отправить несколько разных запросов если это возможно. И прикрепить сюда test1, 2, 3, .bin я посмотрю в чем может быть проблема Последний раз редактировалось Shaft, 23.01.2023 в 14:53. |
Этот пользователь сказал Спасибо Shaft за это полезное сообщение: | ||
svi2012 (23.01.2023)
|
#9
|
|||
|
|||
Цитата:
Я нашел ошибку на своей стороне в библиотеке Lib. Ваш код на 100% работает !!! Благодарю за Вашу помощь. |