以未知格式解码字符串

时间:2019-10-03 08:36:05

标签: string utf-8

我有一个以这种格式返回的字符串:

\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

我正在尝试对它进行解码以获得有效的字符串,但是我不明白它是用wich格式编写的,如果有人对此有一个想法,那么wich是很好的解码器..评论这篇文章。 谢谢

1 个答案:

答案 0 :(得分:1)

您所拥有的是二进制数据,它已经被字符串化为人类可读的格式。

因此,您需要首先解析将其字符转换为字节的字符串。

以转义序列格式编码的子字符串(以'\'字符后接1-4个字符开头)被解码为特定字节,如下所示:

  • \b-> 0x08
  • \t-> 0x09
  • \n-> 0x0A
  • \f-> 0x0C
  • \r-> 0x0D
  • \"-> 0x22
  • \'-> 0x27
  • \\-> 0x5C
  • \u00## + \uff##-> 0x##ff是由于符号扩展,用于字节> = 0x80)

字符串中所有未转义的字符都将按原样转换(即,只需将16位Char转换为8位Byte,而忽略高8位)。

让我们看看您提供的第一个字符串:

  

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

并将其转换为字节:

M S P \u0010 \u0001 \u001a \r \u0012 \u000b {{ 1}} \n \u0007 O r g 2 M S P {{ 1}} \u0010 \u0001 0x0A 0x08 0x62 0x63 0x6E 0x5F 0x74 {{ 1}} 0x65 0x73 0x74 0x12 0x04 0x31 0x2E 0x31 0x34 {{ 1}} 0x1A 0x04 0x65 0x73 0x63 0x63 0x22 0x04 0x76 {{ 1}} 0x73 0x63 0x63 0x2A 0x28 0x12 0x0C 0x12 0x0A {{ 1}} 0x08 0x01 0x12 0x02 0x08 0x00 0x12 0x02 0x08 {{ 1}} 0x01 0x1A 0x0B 0x12 0x09 0x0A 0x07 0x4F 0x72 {{ 1}} 0x67 0x31 0x4D 0x53 0x50 0x1A 0x0B 0x12 0x09 {{ 1}} 0x0A 0x07 0x4F 0x72 0x67 0x32 0x4D 0x53 0x50 {{ 1}} 0x32 0x44 0x0A 0x20 0xFD 0xFD 0x61 0xFD 0xFD {{ 1}} 0xFD 0x33 0x52 0x55 0x34 0xFD 0xFD 0x52 0xFD {{ 1}} 0xFD 0xFD 0xFD 0x40 0xFD 0xFD 0x73 0x08 0xFD {{ 1}} 0x14 0xFD 0xFD 0x2E 0xFD 0x21 0xFD 0x12 0x20 1 0x73 0xFD 0xFD 0x63 0xFD 0x36 0xFD 0xFD {{1} } 0x40 0xFD 0x1E 0x46 0xFD 0x59 0xFD 0x69 0xFD {{1} } 0x24 0xFD 0xFD 0x34 0xFD 0x67 { {1}} 0x50 0xFD 0x3A 0xFD 0x74 0x0E 0x3A 0x20 0x36 { {1}} ђ 0xFD 0xFD 0x33 0x7F 0x4A 0xFD 0x48 0x74 { {1}} 0x04 0xFD 0xFD 0xFD 0xFD 0x5E 0x7B 0x5C 0xFD { {1}} 0x1D 0xFD 0xFD 0xFD 0xFD 0xFD 0x33 0xFD 0x62 { {1}} 0x3F 0x40 0xFD 0x42 0x2C 0x12 0x0C 0x12 0x0A < / p>

一旦解码了字节,就可以根据需要解释二进制数据。它看起来像是类型长度值格式,就像@RobNapier在对您的问题的评论中建议的那样:

  

顺便说一句,这看起来很像TLV(类型-长度-值)格式。第一个字节是类型0x0a,然后是长度0x08,然后是八个字节的数据(“ bcn_test”),之后是类型(0x12),然后是长度(0x04),然后是4个字节的数据( 1.14“),等等

0x08(类型10),0x01(Len 8)
0x12 0x02 0x08 0x00 0x12 0x02 0x08 0x010x1A

0x0D(类型18)0x12(Len 4)
0x0b 0x0A 0x07 0x4F0x72

0x67(类型26)0x31(Len 4)
0x4D 0x53 0x50 0x100x01

0x1A(类型34)0x0D(Len 4)
0x12 0x0B 0x0A 0x070x4F

以此类推...

1:但是,我不确定如何正确解码原始字符串中的0x72。它是Unicode代码点U+0452 CYRILLIC SMALL LETTER DJE,在Java 0x67中是字节0x32。截断为0x4D0x53,或用西里尔字符集(例如Windows-1251)解释为字节0x50,与其他TLV格式不匹配。< / sup>