Декодировать строку в неизвестном формате - PullRequest
0 голосов
/ 03 октября 2019

У меня есть строка, возвращенная в этом формате:

\n\bbcn_test\u0012\u00041.14\u001a\u0004escc\"\u0004vscc*(\u0012\f\u0012\n\b\u0001\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\u000b\u0012\t\n\u0007Org1MSP\u001a\u000b\u0012\t\n\u0007Org2MSP2D\n \ufffd\ufffda\ufffd\ufffd\ufffd3RU4\ufffd\ufffdR\ufffd\ufffd\ufffd\ufffd@\ufffd\ufffds\b\ufffd\u0014\ufffd\ufffd.\ufffd!\ufffd\u0012 s\ufffd\ufffdc\ufffd6\ufffd\ufffd@\ufffd\u001eF\ufffdƳ\ufffdi\ufffd$\ufffd\ufffd4\ufffdgP\ufffd:\ufffdt\u000e: 6ђ\ufffd\ufffd3\u007fJ\ufffdHt\u0004\ufffd\ufffd\ufffd\ufffd^{\\\ufffd\u001d\ufffd\ufffd\ufffd\ufffd\ufffd3\ufffdb?@\ufffdB,\u0012\f\u0012\n\b\u0001\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\r\u0012\u000b\n\u0007Org1MSP\u0010\u0001\u001a\r\u0012\u000b\n\u0007Org2MSP\u0010\u0001

\n\u0004mycc\u0012\u00031.0\u001a\u0004escc\"\u0004vscc*,\u0012\f\u0012\n\b\u0002\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\r\u0012\u000b\n\u0007Org1MSP\u0010\u0003\u001a\r\u0012\u000b\n\u0007Org2MSP\u0010\u00032D\n \ufffd\u0011}\ufffdT\ufffdV \u0010l\ufffdNT\ufffd\ufffdz\ufffd\ufffd\ufffdv+\ufffd˹5;\ufffd@q\ufffd\ufffd\u000e\u0012 \u0007\u001f\u0014)\u001e\u0015+\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdt\ufffd\u0013ak\ufffd\u0015J\ufffd\ufffd\ufffd\ufffdZ\u0017_c&: y\ufffd\ufffdw\ufffdnN\ufffd<\ufffd3^v\ufffdbIB`M\ufffd\ufffd\ufffd)&\u0007x\ufffd;(u\ufffdLB,\u0012\f\u0012\n\b\u0001\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\r\u0012\u000b\n\u0007Org1MSP\u0010\u0001\u001a\r\u0012\u000b\n\u0007Org2MSP\u0010\u0001

Я пытаюсь декодировать ее, чтобы получить допустимую строку, но я не понимаю, написана ли она в том формате, который является хорошимдекодер для этого, если у кого-то есть идея об этом .. прокомментируйте этот пост. спасибо

1 Ответ

1 голос
/ 04 октября 2019

То, что у вас есть, - это двоичные данные, которые были преобразованы в формат, читаемый человеком.

Итак, вам нужно сначала проанализировать строку, преобразовав ее символы в байты.

Подстроки, которые закодированыв формате escape-последовательности (перед которым стоит символ '\', за которым следуют 1-4 символа) декодируются в определенные байты, подобные этому:

  • \b -> 0x08
  • \t -> 0x09
  • \n -> 0x0A
  • \f -> 0x0C
  • \r -> 0x0D
  • \" -> 0x22
  • \' -> 0x27
  • \\ -> 0x5C
  • \u00## + \uff## -> 0x## (ff из-за расширения знака для байтов> = 0x80)

Любые неэкранированные символы в строке должны быть преобразованы как-is (т. е. просто приведение с 16-битного Char к 8-битному Byte игнорирования старших 8 бит).

Давайте посмотрим на первую предоставленную вами строку:

\ п \ bbcn_test \ u0012 \ u00041.14 \ u001a \ u0004escc \ "\ u0004vscc * (\ u0012 \ е \ u0012 \ п \b \ u0012 \ u002 \ u0012 \ u0001 \ u001a \ u000b \ t \ n \ u0007Org1MSP \ u001a \ u000b \ u0012 \ t \ n \ u0007Org2MSP2D \ n \ ufffdufffd \ ufffd \ ufffd3RU4 \ ufffd \ ufffdR \ ufffd \ ufffd \ ufffd \ ufffd @ \ ufffd \ ufffds \ b \ ufffd \ u0014 \ ufffd \ ufffd. \ ufffd \ ufff ufffufffd @ \ ufffd \ ufffd \ ufffdƳ \ ufffdi \ ufffd $ \ ufffd \ ufffd4 \ ufffdgP \ ufffd: \ ufffdt \ u000e: 6ђ ufffd \ ufffd3 \ u007fJ \ ufffd \ uff {uff} ufffdufffd \ u001d \ ufffd \ ufffd \ ufffd \ ufffd \ ufffd3 \ ufffdb? @ \ ufffdB, \ u0012 \ е \ u0012 \ п \ б \ u0001 \ u0012 \ u0002 \ Ь \ u0000 \ u0012 \ u0002 \ б \ u0001 \ u001a\ r0000 \ u000b \ n \ u0007Org1MSP \ u0010 \ u001a \ r \ u0012 \ u \ n0007Org2MSP \ u0010

Разбить отдельные последовательности для декодирования:

\n \b b c n _ t e s t \u0012 \u0004 1 . 1 4 \u001a \u0004 e s c c \" \u0004 v s c c * ( \u0012 \f \u0012 \n \b \u0001 \u0012 \u0002 \b \u0000 \u0012 \u0002 \b \u0001 \u001a \u000b \u0012 \t \n \u0007 O r g 1 M S P \u001a \u000b \u0012 \t \n \u0007 O r g 2 M S P 2 D\n \ufffd \ufffd a \ufffd \ufffd \ufffd 3 R U 4 \ufffd \ufffd R \ufffd \ufffd \ufffd \ufffd @ \ufffd \ufffd s \b \ufffd \u0014 \ufffd \ufffd . \ufffd ! \ufffd \u0012 s \ufffd \ufffd c \ufffd 6 \ufffd \ufffd @ \ufffd \u001e F \ufffd Ƴ \ufffd i\ufffd $ \ufffd \ufffd 4 \ufffd g P \ufffd : \ufffd t \u000e : 6 ђ 1 \ufffd \ufffd 3 \u007f J \ufffd H t \u0004 \ufffd \ufffd \ufffd \ufffd ^{ \\ \ufffd \u001d \ufffd \ufffd \ufffd \ufffd \ufffd 3 \ufffd b ? @ \ufffd B , \u0012 \f \u0012 \n \b \u0001 \u0012 \u0002 \b \u0000 \u0012 \u0002 \b \u0001 \u001a \r \u0012 \u000b \n \u0007 O r g 1 M S P \u0010 \u0001 \u001a \r \u0012 \u000b \n \u0007 O r g 2 M S P \u0010\u0001

И преобразовать их в байты:

0x0A 0x08 0x62 0x63 0x6E 0x5F 0x74 0x65 0x73 0x74 0x12 0x04 0x31 0x2E 0x31 0x340x1A 0x04 0x65 0x73 0x63 0x63 0x22 0x04 0x76 0x73 0x63 0x63 0x2A 0x28 0x12 0x0C 0x12 0x0A 0x08 0x01 0x12 0x02 0x08 0x00 0x12 0x02 0x08 0x01 0x1A 0x0B 0x12 0x09 0x0A 0x07 0x4F 0x72 0x67 0x31 0x4D 0x53 0x50 0x1A 0x0B 0x12 0x09 0x0A 0x07 0x4F 0x72 0x670x32 0x4D 0x53 0x50 0x32 0x44 0x0A 0x20 0xFD 0xFD 0x61 0xFD 0xFD 0xFD 0x33 0x52 0x55 0x34 0xFD 0xFD 0x52 0xFD 0xFD 0xFD 0xFD 0x40 0xFD 0xFD 0x73 0x08 0xFD 0x14 0xFD 0xFD 0x2E 0xFD 0x21 0xFD 0x12 0x20 0x73 0xFD 0xFD 0x63 0xFD 0x36 0xFD 0xFD 0x40 0xFD0x1E 0x46 0xFD 0x59 0xFD 0x69 0xFD 0x24 0xFD 0xFD 0x34 0xFD 0x67 0x50 0xFD 0x3A 0xFD 0x74 0x0E 0x3A 0x20 0x36 ђ 1 0xFD 0xFD 0x33 0x7F 0x4A 0xFD 0x48 0x74 0x04 0xFD 0xFD 0xFD 0xFD 0x5E 0x7B 0x5C 0xFD 0x1D0xFD 0xFD 0xFD 0xFD 0xFD 0x33 0xFD 0x62 0x3F 0x40 0xFD 0x42 0x2C 0x12 0x0C 0x12 0x0A 0x08 0x01 0x12 0x02 0x08 0x00 0x12 0x02 0x08 0x01 0x1A 0x0D 0x12 0x0b 0x0A 0x07 0x4F 0x72 0x67 0x31 0x4D 0x53 0x50 0x10 0x01 0x1A 0x0D 0x12 0x0B 0x0A 0x07 0x4F 0x720x67 0x32 0x4D 0x53 0x50 0x10 0x01

После того, как вы декодировали байты, вы можете интерпретировать двоичные данные по мере необходимости. Это кажется в некотором формате Type-Length-Value, как @RobNapier, предложенный в комментарии к вашему вопросу:

BTW, это похоже на TLV (Тип-длина-значение). Первый байт - это тип 0x0a, за которым следует длина 0x08, за которой следуют восемь байтов данных ("bcn_test"), за которыми следует тип (0x12), за которым следует длина (0x04), за которой следуют 4 байта данных ("1,14 ") и т. Д.

0x0A (тип 10), 0x08 (лен 8)
0x62 0x63 0x6E 0x5F 0x74 0x65 0x73 0x74 (bcn_test)

0x12 (тип 18) 0x04 (Len 4)
0x31 0x2E 0x31 0x34 (1.14)

0x1A (тип 26) 0x04 (Len 4)
0x65 0x73 0x63 0x63 (escc)

0x22 (Тип 34) 0x04 (Лен 4)
0x76 0x73 0x63 0x63 (vscc)

и т. Д ...

1: однако я не уверен, как правильно декодировать ђ в исходной строке. Это кодовая точка Unicode U+0452 CYRILLIC SMALL LETTER DJE, которая в Java Char является байтами 0x04 0x52. Усеченный до 0x04 или 0x52 или интерпретированный в кириллической кодировке, такой как Windows-1251, где это будет байт 0x90, он не совпадает с остальным форматом TLV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...