Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.056 c
2-1212223941
Pi:=3.14...
2008-05-31 12:52
2008.06.29
Код в программе


2-1212403782
ivan8511
2008-06-02 14:49
2008.06.29
Записать базу Paradox после каждого редактирования


15-1210925629
Vlad Oshin
2008-05-16 12:13
2008.06.29
Очень поздние откаты в базе. SQL 2000, D7,


2-1212493010
Nicolas
2008-06-03 15:36
2008.06.29
Запрос на составную выбору без повторений


2-1212069255
Vlad Oshin
2008-05-29 17:54
2008.06.29
RTTI. Не понял что за результат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский