首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反序列化从msg_container服务器返回的telegram.org对象

反序列化从msg_container服务器返回的telegram.org对象
EN

Stack Overflow用户
提问于 2016-09-05 16:03:09
回答 1查看 115关注 0票数 1

我在反序列化msg_container对象时遇到了麻烦。问题似乎在于我对flags字段位于message中的位置的理解,因为这对我来说没有意义。下面的假设来自于阅读本页:https://core.telegram.org/mtproto/TL

这是我所看到的,我希望有人能澄清。

电报服务器的响应如下:

代码语言:javascript
复制
    ('server_answer: ', '\xdc\xf8\xf1s\x02\x00\x00\x00\x018\xcb\x8cCu\xcdW\x01\x00\x00\x00\x1c\x00\x00\x00\x08\t\xc2\x9e\x00t\xbe?Cu\xcdW\x82\x0e:\x11\xe0\xda\xed\x05\xd7\xbezI4\x05Tf\x01\xdc\xcb\x8cCu\xcdW\x02\x00\x00\x00\x14\x00\x00\x00Y\xb4\xd6b\x15\xc4\xb5\x1c\x01\x00\x00\x00\x00t\xbe?Cu\xcdW')

 0 | DC F8 F1 73 02 00 00 00
 8 | 01 38 CB 8C 43 75 CD 57
16 | 01 00 00 00 1C 00 00 00
24 | 08 09 C2 9E 00 74 BE 3F
32 | 43 75 CD 57 82 0E 3A 11
40 | E0 DA ED 05 D7 BE 7A 49
48 | 34 05 54 66 01 DC CB 8C
56 | 43 75 CD 57 02 00 00 00
64 | 14 00 00 00 59 B4 D6 62
72 | 15 C4 B5 1C 01 00 00 00
80 | 00 74 BE 3F 43 75 CD 57

它表示一个MessageContainer对象,如下所示:

代码语言:javascript
复制
msg_container#73f1f8dc messages:vector<message> = MessageContainer;

(注意: 73f1f8dc是返回的前四个字节,按小-endian顺序排列)

由于msg_containervector of messages,下一个整数是message计数,即00 00 00 02,因此在这个向量中有两个消息。

message如下所示:

代码语言:javascript
复制
message#c09be45f flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int = Message;
messageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message;

因此,我假设接下来的四个字节将是第一个消息中的第一个参数,即flags字段。但是,这四个字节的值是8c cb 38 01,为2362128385L的无符号整数,对于一个简单的位掩码来说,它的大小令人怀疑。另外,如果我使用这个值从字节流的其余部分反序列化可选参数,它们就没有意义,最终会因为类型不匹配而失败。我也尝试过将flags字段作为有符号整数,并具有类似的结果。

我对电报服务器如何使用msg_container对象进行响应的理解有什么不正确的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-05 17:06:40

下面是一种用于处理包装在容器中的消息的简单方法:

代码语言:javascript
复制
Container_type_header
Content_count
[messages]

每一条信息都是这样包装的:

代码语言:javascript
复制
msgs_id
seq_no
mgs_len
msg_body

给出你的样本数据:

代码语言:javascript
复制
DCF8F173 --> container_type_header
02000000 --> message_count_in_container

0138CB8C4375CD57 --> msg_id of first message
01000000 --> seq_no of first message
1C000000 --> length of first message; 1C == 28 bytes
0809C29E0074BE3F4375CD57820E3A11E0DAED05D7BE7A4934055466 --> 28 byte msg_body

01DCCB8C4375CD57 --> msg_id of second message
02000000 --> seq_number of second message
14000000 --> lenght of second message; 14 == 20 bytes
59B4D66215C4B51C010000000074BE3F4375CD57 --> 20 byte msg_body

当解码第一条消息时:

代码语言:javascript
复制
0809C29E0074BE3F4375CD57820E3A11E0DAED05D7BE7A4934055466

New_Session_Created{first_msg_id: 6326841983218119680,  server_salt: 7373524212041563863, unique_id: 427238195566612098}

当解码第二条消息时:

代码语言:javascript
复制
0x59B4D66215C4B51C010000000074BE3F4375CD57 

Msgs_Ack{msg_ids: [6326841983218119680]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39334196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档