string - 以未知格式解码字符串
问题描述
我有一个以这种格式返回的字符串:
\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-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\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
\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
0x34
0x1A
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
0x67
0x32
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
0xFD
0x1E
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
0x1D
0xFD
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
0x72
0x67
0x32
0x4D
0x53
0x50
0x10
0x01
一旦你解码了字节,你就可以根据需要解释二进制数据。它似乎是一种类型-长度-值格式,就像@RobNapier 在对您的问题的评论中建议的那样:
顺便说一句,这看起来完全像 TLV(类型-长度-值)格式。第一个字节是类型0x0a,后接长度0x08,后接8字节数据(“bcn_test”),后接类型(0x12),后接长度(0x04),后接4字节数据(“ 1.14") 等。
0x0A
(Type 10), 0x08
(Len 8)
0x62
0x63
0x6E
0x5F
0x74
0x65
0x73
0x74
( bcn_test
)
0x12
(Type 18) 0x04
(Len 4)
0x31
0x2E
0x31
0x34
( 1.14
)
0x1A
(Type 26) 0x04
(Len 4)
0x65
0x73
0x63
0x63
( escc
)
0x22
(Type 34) 0x04
(Len 4)
0x76
0x73
0x63
0x63
( vscc
)
等等 ...
1:但是,我不确定如何正确解码ђ
原始字符串中的。它是 Unicode 代码点U+0452 CYRILLIC SMALL LETTER DJE
,在 JavaChar
中是字节0x04 0x52
。截断为0x04
or 0x52
,或解释为像 Windows-1251 这样的 Cyrillic 字符集,它会是 byte 0x90
,它与 TLV 格式的其余部分不匹配。
推荐阅读
- c++ - 成功注册dll,但在regedit表中没有任何改变
- lua - 如何从 table.remove(x) 中插入 table.insert(x)
- jquery - Azure 图形查询
- oracle - 错误 ORA-06502 WHEN-BUTTON-PRESSED oracle 表单
- spotfire - 当值低于零时,返回零
- android - net.sqlcipher.database.SQLiteException:错误代码 100:另一行可用
- javascript - 提交表单、克隆表单、仅提交新表单、克隆表单等
- html - 如何在不使用 flexbox 的情况下将不同的内容组织在页面的左侧和右侧?
- c++ - C ++ - 分配给'this'不合时宜
- mysql - MySQL - 如何根据特定序列获取记录