![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет. Помогите разобраться с таким вопросом.
Есть рабочая программа, написанная на 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% работает !!! Благодарю за Вашу помощь. |