我有一个以这种格式返回的字符串:
\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是很好的解码器..评论这篇文章。 谢谢
答案 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
0x01
(0x1A
)
0x0D
(类型18)0x12
(Len 4)
0x0b
0x0A
0x07
0x4F
(0x72
)
0x67
(类型26)0x31
(Len 4)
0x4D
0x53
0x50
0x10
(0x01
)
0x1A
(类型34)0x0D
(Len 4)
0x12
0x0B
0x0A
0x07
(0x4F
)
以此类推...
1:但是,我不确定如何正确解码原始字符串中的0x72
。它是Unicode代码点U+0452 CYRILLIC SMALL LETTER DJE
,在Java 0x67
中是字节0x32
。截断为0x4D
或0x53
,或用西里尔字符集(例如Windows-1251)解释为字节0x50
,与其他TLV格式不匹配。< / sup>