etc:
Orrignal function in BufferedBinaryReader :
public string ReadString(uint numChars)
{
SynchBits();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numChars; i++)
{
char c = ReadChar();
if (c != '\0')
sb.Append(c);
}
return sb.ToString();
}
should be like this:
public string ReadStringUTF8(uint numChars)
{
SynchBits();
byte[] byteArray = new byte[numChars];
byte[] result = null;
for (int i = 0; i < numChars; i++)
{
byteArray[i] = ReadByte();
}
if (byteArray[numChars - 1] == 0)
{//no encoding
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numChars; i++)
{
char c = (char)byteArray[i];
if (c != '\0')
sb.Append(c);
}
return sb.ToString();
}
else
{//encoding is unicode\
result = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("gbk"), byteArray);
return Encoding.GetEncoding("gbk").GetString(result);
}
}
mark
public override string ReadString()
{
SynchBits();
int length = 0;
long dataPostion = BaseStream.Position;
while (ReadByte() != 0)
{
length++;
}
BaseStream.Position = dataPostion;
byte[] _buffer = new byte[length];
BaseStream.Read(_buffer, 0, length);
BaseStream.Position += 1;
return Encoding.UTF8.GetString(_buffer, 0, length);
//SynchBits();
//StringBuilder sb = new StringBuilder();
//char c = 'a';
//while ((c = ReadChar()) != 0)
// sb.Append(c);
//return sb.ToString();
}
/// <summary>
/// Reads the string.
/// </summary>
/// <param name="numChars">Num chars to read.</param>
/// <returns></returns>
public string ReadString(uint numChars)
{
SynchBits();
byte[] _buffer = new byte[numChars-1];
BaseStream.Read(_buffer, 0, (int)numChars-1);
BaseStream.Position += 1;
return Encoding.UTF8.GetString(_buffer, 0, (int)numChars-1);
//SynchBits();
//StringBuilder sb = new StringBuilder();
//for (int i = 0; i < numChars; i++)
//{
// char c = ReadChar();
// if (c != '\0')
// sb.Append(c);
//}
//return sb.ToString();
}