1

在后台:我从一个 MYSQL 数据库中得到一个 byte[] 字符串,如下所示:

s:12:"NUL*NUL_messages"; 

我想在 Java 中将其转换为字符串:

String str = new String(sd);

但现在字符串只包含 10 个字符:

s:12:"*_messages"; 

但它需要有 12 个字符才能进行以下解析。有人可以帮我怎么做才能不删除“NUL”字节吗?

4

1 回答 1

2

NULL字符串输出内部代表代码点为零的字符。你的字符串相当于这个:

String s = "\0*\0_messages";

在 Java\0中是不可打印的。但是,字符串会保留它 - 如果您检查字符串的长度,它是 12,而不是 10,尽管当您将字符串输出到控制台时只打印十个字符:

System.err.println(s.length());
System.err.println(s);

打印(演示

12
*_messages

评论:这不适用于serialized-php-parser

该解析器的问题在于它的parseString方法(第 156 行)期望打印字符串的长度与s:<length>:构造中的字符数相匹配。由于声明<length>为 12 但实际长度仅为 10,parseString因此在第 175..176 行的流中消耗了两个额外字符,从而破坏了其他所有内容。

如果您想继续使用该解析器,请考虑'\0'在对字符串进行编码之前将字符替换为您不使用的其他可打印字符,例如下划线,然后'\0'放回解析器的另一侧。

于 2013-08-17T11:17:23.170 回答