ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

переменную Jpeg из памяти в Socket
  #1  
Старый 10.05.2009, 03:46
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
Exclamation переменную Jpeg из памяти в Socket

Нужна помощь в отправке переменной типа TJpegImage в сокет "на лету" из памяти. вариант сохранить в файл а затем отправлять не предлагать

перевожу сначала Jpeg в MemoryStream а затем стрим копирую в буфер, но уже при самом переводе из jpeg в memorystream облом какойто, размер картинки в два раза растет, а при передаче в буфер совсем ноль, может существует способ непосредственно используя переменную jpeg отправлять в сокет?

PHP код:
procedure SendJpeg(JpegName:String);
const
  
PACKET_DATA_SIZE 16777216;//16*1024*1024//16ÌÁ
type
  PByteArray 
= ^TByteArray;
  
TByteArray = array[0..PACKET_DATA_SIZE-1of byte;
var
  
Buf       PByteArray;
  
jpg       TJpegImage;
  
MemStream TMemoryStream;
  
flw       File;
begin
  jpg 
:= TJpegImage.Create;
  
MemStream := TMemoryStream.Create;
  try
    
jpg.LoadFromFile(JpegName);
    try
      
jpg.SaveToStream(MemStream);
      
GetMem(Buf,MemStream.Size);
      
MemStream.WriteBuffer(Buf^,MemStream.Size);
      
SendBuf(Sock,Buf^,MemStream.Size);

      
jpg.SaveToFile('1.jpg');//сохраняется файл размером 3 кб
      
MemStream.SaveToFile('C:\2.jpg');//сохраняется файл размером 6 кб

      
AssignFile(flw,'C:\3.jpg');
      
ReWrite(flw,1);
      
BlockWrite(flw,buf^,MemStream.Size);//ничего не сохраняется
      
CloseFile(flw);

      
FreeMem(Buf);
    finally
    
end;
  finally
    
jpg.free;
    
MemStream.Free;
  
end;
end
 
Ответить с цитированием

  #2  
Старый 10.05.2009, 10:32
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

MemStream.WriteBuffer(Buf^,MemStream.Size); - это ты запишешь буфер в поток, а тебе нужно читать его типа ReadBuffer. Воть только не забывай устанавливать позицию на начала потока MemStream.position:=0; типа так
 
Ответить с цитированием

  #3  
Старый 10.05.2009, 15:58
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

Все равно ничего не вышло

Видимо всте таки придется записать в файл а затем отправить в сокет
 
Ответить с цитированием

  #4  
Старый 10.05.2009, 17:03
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию

Способ 1.

Можно воспользоваться компонентами TNMStrmServ и TNMStrm. Они специально предназначены для обмена потоками данных.


PHP код:
//Обработчик для клиента: 
var
  
MyStreamTMemoryStream;
  
JpgTJpegImage;
begin
  
...
  
//тут сами определите как у вас появляется Jpg
  
... 
  
MyStream := TMemoryStream.Create;
  
Jpg.SaveToStream(MyStream);
  
NMStrm1.PostIt(MyStream);
  
MyStream.Free;
end;

//Обработчик для сервера: 
procedure TForm1.NMStrmServ1MSG(SenderTComponent;
const 
sFromstringstrmTStream);
var
  
MyStreamTMemoryStream;
begin
  MyStream 
:= TMemoryStream.Create;
  
MyStream.CopyFrom(strmNMStrmServ1.BytesTotal);
  
MyStream.SaveToFile('c:\windows\1.jpg');
end
2 Способ.

рекомендую.


PHP код:
private
  { Private 
declarations }
  
Recivingboolean;
  
DataSizeinteger;
  
DataTMemoryStream;
...

...
procedure TForm1.ClientSocket1Connect(SenderTObject;
SocketTCustomWinSocket);
begin
  
// Посылаем команду для начала передачи файла.
  
Socket.SendText('send');
end;

procedure TForm1.ClientSocket1Read(SenderTObject;
SocketTCustomWinSocket);
var
  
sslstring;
  
JpgTJpegImage;
begin
  
...
  
// и тут сами определите откуда у вас Jpg
  
...
  
s:= Socket.ReceiveText;
  
// Если мы не в режиме приёма:
  
if not Reciving then
  begin
  
// Теперь нам необходимо получить длину потока данных.
    
SetLength(slStrLen(PChar(s))+1); // +1 for the null terminator
    
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
    
DataSize:= StrToInt(sl);
    
Data:= TMemoryStream.Create;
    
// Удаляем информацию о размере из данных.
    
Delete(s1Length(sl));
    
Reciving:= true;
  
end;
  
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
  
try
    
Data.write(s[1], length(s));
    if 
Data.Size DataSize then
    begin
      Data
.Position:= 0;
      
Jpg.LoadFromStream(Data);
      
Data.Free;
      
Reciving:= false;
      
Socket.Close;
    
end;
  
except
    Data
.Free;
  
end;
end;


procedure TForm1.ServerSocket1ClientRead(SenderTObject;
SocketTCustomWinSocket);
var
  
msTMemoryStream;
  
JpgTJpegImage;
begin
  
...
  
// и даже тут сами определите откуда у вас Jpg
  
...
  
// Клиент получает команду на передачу файла.
  
if Socket.ReceiveText 'send' then
  begin
    ms
:= TMemoryStream.Create;
    try
      
// Получаем данные на передачу.
      
Jpg.SaveToStream(ms);
      
ms.Position:= 0;
      
// Добавляем длину данных, чтобы клиент знал,
      // сколько данных будет передано
      // Добавляем #0 , чтобы можно было определить,
      // где заканчивается информация о размере.
      
Socket.SendText(IntToStr(ms.Size) + #0);
      // Посылаем его.
      
Socket.SendStream(ms);
    
except
      
// Итак, осталось освободить поток, если что-то не так.
      
ms.Free;
    
end;
  
end;
end;

end

удачи в написании))) не забывайте передавать зашифрованные данные.
 
Ответить с цитированием

  #5  
Старый 10.05.2009, 18:35
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

пишу без сервер/клиент сокета, использую ВинСок, поэтому не подходит вариант.

Буду искать аналог юнита джипег или потрошить три-четыре модуля придется.
 
Ответить с цитированием

  #6  
Старый 19.05.2009, 13:00
Ryu
Новичок
Регистрация: 13.06.2008
Сообщений: 24
Провел на форуме:
28814

Репутация: 4
По умолчанию

http://hellknights.void.ru/articles/0x48k-VisualSpy.htm

Медитируй и просветлишся.

З.Ы.Да, там правда автор синячит, но настоящему дельфину это перелопатить не составит труда, там голое АПИ

Последний раз редактировалось Ryu; 19.05.2009 в 13:03..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
4 и более GB ОЗУ для ОС Windows (32/64) NetSter Аппаратное обеспечение 10 28.12.2009 20:11
Преодолевая ограничения Windows: физическая память jawbreaker Чужие Статьи 1 16.02.2009 02:12
Назревает революция в технологиях оперативной памяти jerrri Мировые новости 1 10.02.2009 02:47
Графический стандарт JPEG XR готовится к дебюту WAR!9G Мировые новости 0 01.02.2009 12:14
асм, дизасм, принцип работы процов на определенном уровне. Cthulchu Аппаратное обеспечение 0 05.01.2009 20:14



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ