Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизУпаковать число в бинарную строку или аналог функции pack php Найти похожие ветки
← →
alex-drob (2008-06-01 15:39) [0]есть условие:
Все числовые данные передаются как четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, последним младший.
как мне число 12 представить в таком виде?
Вобщем нужно то же что получиться после выполнения pack("l",12); в пхп.
← →
Ум_ще (2008-06-01 16:22) [1]Не подойдут функции htonl, htons, ntohs, ntohl?
← →
Ум_ще (2008-06-01 16:25) [2]Да и вручную поменять порядок байт не проблема.
← →
Юрий Зотов © (2008-06-01 16:41) [3]
type
TData = packed array[0..3] of byte;
function IntToData(N: Cardinal): TData;
var
i: integer;
begin
for i := 0 to 3 do
Result[3-i] := TData(N)[i]
end;
function DataToInt(D: Tdata): Cardinal;
var
i: integer;
begin
for i := 0 to 3 do
TData(Result)[3-i] := D[i]
end;
← →
alex-drob (2008-06-01 16:42) [4]я просто не могу понять что должно получиться.
нужно строку создать
длина строки+строка+длина 2 строки+2 строка
так вот длина строки должна быть представлена как в [0]
а про [1] я не знаю, я таких функций не знал, щас в пороюсь почитаю
← →
alex-drob (2008-06-01 17:05) [5]описание выглядит так:
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
или я не правельно понял?
← →
Anatoly Podgoretsky © (2008-06-01 17:29) [6]> alex-drob (01.06.2008 15:39:00) [0]
Это как раз сетевой порядок.
← →
alex-drob (2008-06-01 17:34) [7]так как мне это всётаки сделать, весь нет перерыл, всё на перле и пхп, везде функция pack, а в делфе ее нет!
← →
Ум_ще (2008-06-01 17:36) [8]
> так как мне это всётаки сделать, весь нет перерыл, всё на
> перле и пхп, везде функция pack, а в делфе ее нет!
> MMP бинарный протокол. Все числовые данные передаются как
> четырехбайтные целые НЕ в сетевом формате, т. е. первым
> идет старший байт, последним младший.Move(IntValue,Buffer,SizeOf(Int));
← →
alex-drob (2008-06-01 18:04) [9]делаю так:
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);
не чего не получаеться
← →
alex-drob (2008-06-01 19:28) [10]вобщем так и не разобрался вот код
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));
авторизация не проходит.
← →
Юрий Зотов © (2008-06-01 19:56) [11]В каком виде должны заноситься числа в строку-буфер? В своем внутреннем формате, или в виде hex-строки?
В коде Вы заносите их во внутреннем формате, поэтому младший байт числа 12 будет занесен, как символ #12, так что подстрока "С000" никак не получится. Если нужна именно она - используйте IntToHex.
Кроме того, передача числа 12 в виде C000 означает, что первым идет младший байт, а не старший, как написано в протоколе.
← →
alex-drob (2008-06-01 20:07) [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;
← →
alex-drob (2008-06-02 21:10) [13]что то мне кажеться что
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));
то не работает, но оно и не должно! а как правельно сделать?
← →
Германн © (2008-06-03 00:44) [14]
> есть пример на пхп
Используя этот пример получи результирующую строку и приведи её тут вместе с исходными данными. Разбираться в [13] нет никакого желания.
P.S. Правильно пишется через И.
← →
Германн © (2008-06-03 00:51) [15]
> Anatoly Podgoretsky © (01.06.08 17:29) [6]
>
> > alex-drob (01.06.2008 15:39:00) [0]
>
> Это как раз сетевой порядок.
>
Смущает что байты-то идут начиная с младшего, но их нибблы поменяны местами. Или я что-то не знаю про "сетевой порядок"?
← →
alex-drob (2008-06-03 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) [17]кстате файл с сайта mail.ru с описанием получаеться устарел?
или
((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR)) <> $107
← →
Германн © (2008-06-03 01:39) [18]
> 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;
> и всё заработало!
> а потратил на это две бессонные ночи!
>
Боже, твои пути неисповедимы!
← →
Randew (2008-06-03 02:34) [19]А зачем там 4 прибавляется?
← →
alex-drob (2008-06-03 02:39) [20]где?
← →
Randew (2008-06-03 02:47) [21]Вот в этой строке: len:=4+login_len+4+pass_len+4+4+cl_len;
← →
alex-drob (2008-06-03 02:50) [22]пакет так формируется:
(длина логина)+логин+(длина пароля)+пароль+статус+(длина описания клиента)+описание
каждая длинна - 4 байта
статус тоже 4 байта
← →
Randew (2008-06-03 02:52) [23]
> пакет так формируется:(длина логина)+логин+(длина пароля)+пароль+статус+(длина
> описания клиента)+описаниекаждая длинна - 4 байта статус
> тоже 4 байта
Ясно. Спасибо за объяснение.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.048 c