Я вручную расшифровал вашу строку и согласен с библиотекой: ваше сообщение обрезано. Я предполагаю , что это потому, что вы используете API на основе строк, и в данных есть нулевой байт - многие текстовые API видят нулевой байт (NUL
в терминах ASCII) означать конец строки.
Вот разбивка:
\n=10=field 1, length prefix - I'm assuming this is a string
\x14=20
"id:article:v1:964000"
(22 bytes used for field 1)
\x12=18=field 2, length prefix - I'm assuming this is a sub-messssage
$=36
\n=10=field 1, length prefix - I'm assuming this is a string
\x10=16
"predicted_topics"
(18 bytes used for field 2.1)
\x12=18=field 2, length prefix - I'm assuming this is a string
\x06=6
"IS/biz"
(8 bytes used for field 2.2)
\x1a=26=field 3, length prefix - I'm assuming this is "bytes"
\x08=8
\xf0
l
\x8f
\xde
p
\x9f
\xe4
(unexpected EOF)
в конце мы пытаемся декодировать 8 байтов самого внутреннего сообщения, и у нас осталось только 7 байтов. Я знаю, что это не дополнительное сообщение, потому что это приведет к неверному тегу, и он не будет выглядеть как UTF-8, поэтому я предполагаю, что это поле bytes
(но, честно говоря, это не так Дело в том, что нам нужно 8 байт, а у нас только 7).
Я предполагаю, что последний байт в поле bytes
был равен нулю; если мы предположим пропущенный \x00
в конце, то поле 2.3 будет 10 байтов, и мы учли 18 + 8 + 10 = 36 байтов, что сделает под-сообщение (поле 2) завершенным. Вполне может быть больше пропущенных данных после внешнего дополнительного сообщения - я не могу знать.
Итак: убедитесь, что вы не используете текстовые API с двоичными данными.