Java 将包含NUL的bytearray转换为字符串

Java 将包含NUL的bytearray转换为字符串,java,string,bytearray,Java,String,Bytearray,背景:我从MYSQL数据库中获得一个字节[]字符串,如下所示: s:12:"NUL*NUL_messages"; 我想用Java将其转换为字符串: String str = new String(sd); 但现在该字符串仅包含10个字符: s:12:"*_messages"; 但是它需要有12个字符,以便下面的解析工作。有人能帮我做些什么使“NUL”字节不被删除吗?NULL在字符串输出中代表代码点为零的字符。您的字符串等效于以下内容: String s = "\0*\0_message

背景:我从MYSQL数据库中获得一个字节[]字符串,如下所示:

s:12:"NUL*NUL_messages"; 
我想用Java将其转换为字符串:

String str = new String(sd);
但现在该字符串仅包含10个字符:

s:12:"*_messages"; 

但是它需要有12个字符,以便下面的解析工作。有人能帮我做些什么使“NUL”字节不被删除吗?

NULL
在字符串输出中代表代码点为零的字符。您的字符串等效于以下内容:

String s = "\0*\0_messages";
在Java中,
\0
是不可打印的。但是,字符串会保留它-如果检查字符串的长度,则长度为12,而不是10,尽管在将字符串输出到控制台时仅打印10个字符:

System.err.println(s.length());
System.err.println(s);
印刷品()

注释:这不适用于

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


如果您想继续使用该解析器,请考虑在编码字符串之前,使用其他不可打印的字符(例如,下划线)替换<代码> > 0代码>字符,然后在解析的另一边放置<代码> \“0”<代码>。

我理解。非常感谢。但我的问题是,如果字符串中包含此NUL值,则以下使用“序列化php解析器”的解析将不起作用。是否有可能
int delimiter=input.indexOf(':',index)
private int readLength()
中失败?实际上,
System.out.println(“\0*\0\u消息”)
不打印任何内容,并且
System.out.println(“sta\0*\0\u消息”)仅打印
sta
。我正在运行1.6 openjdk。@rocketboy这一定是openjdk的问题。请按照上面的
demo
链接查看如何使用Java 7 JDK。@rocketboy,no readLength()不会有问题,因为它只读取12 as长度。问题一定出在parseString()@Wotim中。看起来解析器试图阻止您在字符串体中嵌入零。我不熟悉PHP的内部结构,但很可能它使用C字符串,因此禁止嵌入NULL(C使用NULL字符终止字符串)。如果与PHP的互操作性是目标,那么用0x0000替换0x0001可能是一个突破性的变化。另一方面,如果是Java到Java,那么这个更改可能没有问题。
12
*_messages