![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Упаковать число в бинарную строку или аналог функции pack php
alex-drob © (2008-06-01 15:39:00)есть условие:
Все числовые данные передаются как четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, последним младший.
как мне число 12 представить в таком виде?
Вобщем нужно то же что получиться после выполнения pack("l",12); в пхп.
Randew (2008-06-03 02:52:00) [1]
> пакет так формируется:(длина логина)+логин+(длина пароля)+пароль+статус+(длина
> описания клиента)+описаниекаждая длинна - 4 байта статус
> тоже 4 байта
Ясно. Спасибо за объяснение.
alex-drob (2008-06-03 02:50:00) [2]пакет так формируется:
(длина логина)+логин+(длина пароля)+пароль+статус+(длина описания клиента)+описание
каждая длинна - 4 байта
статус тоже 4 байта
Randew (2008-06-03 02:47:00) [3]Вот в этой строке: len:=4+login_len+4+pass_len+4+4+cl_len;
alex-drob (2008-06-03 02:39:00) [4]где?
Randew (2008-06-03 02:34:00) [5]А зачем там 4 прибавляется?
Германн (2008-06-03 01:39:00) [6]
> alex-drob (03.06.08 01:16) [16]
>
> Всё, разобрался! Спасибо всем кто откликнулся!
> Я просто файл с константами взял готовый, там такие строки:
>
>
> const
> PROTO_VERSION_MAJOR = 1;
> PROTO_VERSION_MINOR = 7;
> PROTO_VERSION = $107;
>
> а в файле с описанием:
>
> #define PROTO_VERSION_MAJOR 1
> #define PROTO_VERSION_MINOR 7
> #define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR))
>
> вобщем вроде всё правильно,я с++ не знаю.
> в програмке в onSend и в onReceive вывел в tmemo данные
> которые передаються, и получилось что у меня отправляеться
>
> версия 07 01 00 00
> а принимаеться строка 0A 00 01 00
> вобщем поменял
> PROTO_VERSION = $107; на PROTO_VERSION = $1000A;
> и всё заработало!
> а потратил на это две бессонные ночи!
>
Боже, твои пути неисповедимы!
alex-drob (2008-06-03 01:18:00) [7]кстате файл с сайта mail.ru с описанием получаеться устарел?
или
((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR)) <> $107
alex-drob (2008-06-03 01:16:00) [8]Всё, разобрался! Спасибо всем кто откликнулся!
Я просто файл с константами взял готовый, там такие строки:
const
PROTO_VERSION_MAJOR = 1;
PROTO_VERSION_MINOR = 7;
PROTO_VERSION = $107;
а в файле с описанием:
#define PROTO_VERSION_MAJOR 1
#define PROTO_VERSION_MINOR 7
#define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR))
вобщем вроде всё правильно,я с++ не знаю.
в програмке в onSend и в onReceive вывел в tmemo данные которые передаються, и получилось что у меня отправляеться
версия 07 01 00 00
а принимаеться строка 0A 00 01 00
вобщем поменял
PROTO_VERSION = $107;наPROTO_VERSION = $1000A;
и всё заработало!
а потратил на это две бессонные ночи!
Германн (2008-06-03 00:51:00) [9]
> Anatoly Podgoretsky © (01.06.08 17:29) [6]
>
> > alex-drob (01.06.2008 15:39:00) [0]
>
> Это как раз сетевой порядок.
>
Смущает что байты-то идут начиная с младшего, но их нибблы поменяны местами. Или я что-то не знаю про "сетевой порядок"?
Германн (2008-06-03 00:44:00) [10]
> есть пример на пхп
Используя этот пример получи результирующую строку и приведи её тут вместе с исходными данными. Разбираться в [13] нет никакого желания.
P.S. Правильно пишется через И.
alex-drob (2008-06-02 21:10:00) [11]что то мне кажеться что
move(mph,buf2[0],sizeof(mph));
не праельно копирует, или я не правельно ей пользуюсь!
например
move(buf[1],buf2[44],length(buf));
где buf:string
buf2: array of char;
при такой записи всё правельно.
а при такой, нет:
move(buf,buf2[44],length(buf));
а если первую строку также записать
move(mph[0],buf2[0],sizeof(mph));
то не работает, но оно и не должно! а как правельно сделать?
alex-drob (2008-06-01 20:07:00) [12]так я не знаю! всё что мне извесно написанно в alex-drob (01.06.08 17:05) [5]
есть пример на пхп, посмотрев там я решил что 0с 00 00 00, но нужно предсавление 4 байтовое.
$tmp = pack ("l", strlen ($login)).$login.pack("l", strlen ($pass)).$pass."\x22\x10\x00\x00".pack ("l", strlen ($client)).$client;
$packet = "\xEF\xBE\xAD\xDE".//CS_MAGIC
"\x0A\x00\x01\x00".//номер отправляемой команды
"\x03\x10\x00\x00". //тип пакета
"\x38\x10\x00\x00".//номер команды и/или ответа MRIM_CS_LOGIN2
pack ("l", strlen ($tmp)). // Длина данных
"\x00\x00\x00\x00". // Адрес отправителя
"\x00\x00\x00\x00". // Порт отправителя
"\x00\x00\x00\x00".//++++++++++++++++++++
"\x00\x00\x00\x00".//
"\x00\x00\x00\x00".//зарезервиравано
"\x00\x00\x00\x00".//+++++++++++++++++++++
$tmp; //собственно данные
fwrite ($fp, $packet);
я не могу перевисти строку где формируеться tmp с пхп на делфи.
\x22\x10\x00\x00- это константаMRIM_CS_CHANGE_STATUS = $1022;
Юрий Зотов (2008-06-01 19:56:00) [13]В каком виде должны заноситься числа в строку-буфер? В своем внутреннем формате, или в виде hex-строки?
В коде Вы заносите их во внутреннем формате, поэтому младший байт числа 12 будет занесен, как символ #12, так что подстрока 'С000' никак не получится. Если нужна именно она - используйте IntToHex.
Кроме того, передача числа 12 в виде C000 означает, что первым идет младший байт, а не старший, как написано в протоколе.
alex-drob (2008-06-01 19:28:00) [14]вобщем так и не разобрался вот код
stat:=proto.MRIM_CS_CHANGE_STATUS;
tcpc.RemoteHost:='mrim.mail.ru';
tcpc.RemotePort:='2042';
tcpc.Connect;
s:=tcpc.Receiveln();
memo1.Lines.add('1 - '+s);
ip:=system.Copy(s,0,system.pos(':',s)-1);
port:=copy(s,pos(':',s)+1,length(s)-pos(':',s)-1);
memo1.Lines.Add(ip);
memo1.Lines.add(port);
tcpc.Disconnect;
mph.magic:=proto.CS_MAGIC;
mph.proto:=proto.PROTO_VERSION;
mph.seq:=0;
mph.msg:=proto.MRIM_CS_HELLO;
mph.dlen:=0;
mph.fromport:=strtoint(port);
tcpc.RemoteHost:=ip;
tcpc.RemotePort:=port;
tcpc.Connect;
if tcpc.Connected then memo1.Lines.Add('Connected');
tcpc.SendBuf(mph,sizeof(mph));
tcpc.ReceiveBuf(mph1,sizeof(mph1));
memo1.Lines.Add(inttostr(mph1.msg));
tcpc.ReceiveBuf(d,mph1.dlen);
memo1.Lines.Add(inttostr(integer(d)));
mph.msg:=proto.MRIM_CS_LOGIN2;
login:='************';
login_len:=length(login);
pass:='**********';
pass_len:=length(pass);
cl:='mymail';
cl_len:=length(cl);
len:=4+login_len+4+pass_len+4+4+cl_len;
setlength(buf,len);
move(login_len,buf[0],4);
move(login[1],buf[4],login_len);
move(pass_len,buf[4+login_len],4);
move(pass[1],buf[8+login_len],pass_len);
move(stat,buf[8+login_len+pass_len],4);
move(cl_len,buf[12+login_len+pass_len],4);
move(cl[1],buf[16+login_len+pass_len],cl_len);
setlength(buf2,sizeof(mph)+length(buf));
move(mph,buf2[0],sizeof(mph));
move(buf[0],buf2[44],length(buf));
tcpc.SendBuf(buf2,len);
tcpc.ReceiveBuf(mph1,sizeof(mph1));
авторизация не проходит.
alex-drob (2008-06-01 18:04:00) [15]делаю так:
len:=sizeof(mph)+4+login_len+4+pass_len+4+4+cl_len;
setlength(buf,len);
move(mph,buf[1],sizeof(mph));
move(login_len,buf[45],4);
move(login,buf[49],login_len);
move(pass_len,buf[49+login_len],4);
move(pass,buf[53+login_len],pass_len);
move(stat,buf[53+login_len+pass_len],4);
move(cl_len,buf[57+login_len+pass_len],4);
move(cl,buf[61+login_len+pass_len],cl_len);
не чего не получаеться
Ум_ще (2008-06-01 17:36:00) [16]
> так как мне это всётаки сделать, весь нет перерыл, всё на
> перле и пхп, везде функция pack, а в делфе ее нет!
> MMP бинарный протокол. Все числовые данные передаются как
> четырехбайтные целые НЕ в сетевом формате, т. е. первым
> идет старший байт, последним младший.
Move(IntValue,Buffer,SizeOf(Int));
alex-drob (2008-06-01 17:34:00) [17]так как мне это всётаки сделать, весь нет перерыл, всё на перле и пхп, везде функция pack, а в делфе ее нет!
Anatoly Podgoretsky (2008-06-01 17:29:00) [18]> alex-drob (01.06.2008 15:39:00) [0]
Это как раз сетевой порядок.
alex-drob (2008-06-01 17:05:00) [19]описание выглядит так:
MMP бинарный протокол. Все числовые данные передаются как четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, последним младший. Четырехбайтовые беззнаковые целые обозначаются UL.
Текстовые данные передаются с префексированной длиной, т. е. сначала UL, а потом строка (в кодировке windows-1251) длины UL без завершающего нуля. Обозначение в дальнейшем - LPS.
Тип данных UIDL используется только при работе с оставленными на сервере сообщениями. UIDL - последовательность из 8 символов из множества [a-z A-Z 0-9 _ - = +].
Пакет: Авторизация
Имя пакета: MRIM_CS_LOGIN2
Тип пакета: cs
Параметры:
LPS ## login ## email авторизующегося пользователя
LPS ## password ## пароль
UL ## status ## статус (см. MRIM_CS_CHANGE_STATUS)
LPS ## user_agent ## текстовое описание клиента пользователя, например "Mail.Ru Miranda Plugin v 1.0"
я не могу разобраться как должна выглядеть строка
строка должна быть вида
(длинна логина)+логин+(длинна пароля)+пароль+статус+(длина клиента)+клиент
есть:
логин: alex@mail.ru
пароль: 12345
статус: $00000001
клиент: mailagent
т.е. когда строке сформирована правельно должно получиться:
C000alex@mail.ru50001234510009000mailagent
или я не правельно понял?
alex-drob (2008-06-01 16:42:00) [20]я просто не могу понять что должно получиться.
нужно строку создать
длина строки+строка+длина 2 строки+2 строка
так вот длина строки должна быть представлена как в [0]
а про [1] я не знаю, я таких функций не знал, щас в пороюсь почитаю