public string TryToReadNextString() {
var stream = BaseStream;
const int l = 2048;
var b = new byte[l + 4];
int bytesRead;
while ((bytesRead = stream.Read(b, 4, l)) > 0) {
var i = 3;
while (i < bytesRead) {
if (!IsStringCharacter(b[i])) {
i += 4;
} else if (!IsStringCharacter(b[i - 1])) {
i += 3;
} else if (!IsStringCharacter(b[i - 2])) {
i += 2;
} else if (!IsStringCharacter(b[i - 3])) {
++i;
} else {
var sb = new StringBuilder();
for (i = i - 3; i < bytesRead; i++) {
var n = b[i];
if (IsStringCharacter(n)) {
sb.Append((char)n);
} else {
break;
}
}
if (i == bytesRead) {
int n;
while ((n = stream.ReadByte()) != -1) {
if (IsStringCharacter(n)) {
sb.Append((char)n);
} else {
BaseStream.Seek(-1, SeekOrigin.Current);
break;
}
}
} else {
BaseStream.Seek(i - bytesRead - 4, SeekOrigin.Current);
}
return sb.ToString();
}
}
b[0] = b[l];
b[1] = b[l + 1];
b[2] = b[l + 2];
b[3] = b[l + 3];
}
return null;
}